0%


title: Android面试相关链接
date: 2020-04-10 18:08:32
tags: Android
categories: Android

top: true

######Blankj

  1. RecyclerView性能优化
    https://github.com/Blankj/AndroidOfferKiller/blob/master/android/RecyclerView%20%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96.md

  2. App启动过程(含Activity启动过程)
    https://github.com/Blankj/AndroidOfferKiller/blob/master/android/App%20%E5%90%AF%E5%8A%A8%E8%BF%87%E7%A8%8B%EF%BC%88%E5%90%AB%20Activity%20%E5%90%AF%E5%8A%A8%E8%BF%87%E7%A8%8B%EF%BC%89.md

Read more »

Handler 整理

Handler相关
1.谈谈消息机制Handler作用?有哪些要素?流程是怎样的?
考点:

作用
四大要素
具体流程
参考答案:

Handler的作用主要是与UI线程进行通信和延迟任务执行
四大要素:Message、MessageQueue、Handler、Looper
MessageQueue负责消息的存储与管理,使用单链表实现,为了快速插入和删除,在其next()方法无限循环判断是否有新消息,有就返回并移除
Handler负责Message的发送和处理
Looper负责关联线程和分发消息,在该线程的MessageQueue中取Message,分发给Handler。
Looper在创建的时候会创建一个MessageQueue,调用loop()方法开始消息循环,然后不断调用MessageQueue的next()方法,有消息处理,没有就阻塞。
2.一个线程能否创建多个Handler,Handler跟Looper之间的对应关系?
对于一个线程来说,只能有一个Looper,创建Looper的时候创建一个MessageQueue,可以分发到多个Handler
—> 可以从Looper扩展到ThreadLocal

Read more »

1.mCommonRecyclerView.addOnChildAttachStateChangeListener(this);

mCommonRecyclerView.addOnChildAttachStateChangeListener(this);

通过重写onChildViewAttachedToWindow与onChildViewDetachedFromWindow方法

Read more »

version.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
/**
* Shared file between builds so that they can all use the same dependencies and
* maven repositories.
**/

ext.deps = [:]

def versions = [
android_gradle_plugin: '3.6.2',
kotlin : '1.3.50',
support : '1.0.2',
design : '1.0.0',
recyclerview : '1.0.0',
constraintlayout : '1.1.3',
viewpager2 : '1.0.0-alpha06',
dagger : '2.23.1',
rxjava : '2.2.8',
rxandroid : '2.1.1',
rxkotlin : '2.3.0',
autodispose : '1.3.0',
okio : '2.1.0',
okhttp : '3.12.3', //https://github.com/square/okhttp/issues/4746
retrofit : '2.5.0',
timber : '4.7.1',
lifecycle : '2.0.0',
moshi : '1.8.0',
junit : '4.12',
xcodescanner : '1.1.10',
autosize : '1.1.2',
rxpermissions : '0.10.2',
recyclerviewadapter : '2.9.45-androidx',
smartrefresh : '1.1.0-andx-10',
qrcode_zxing : '1.3.6',
qrcode_zbar : '1.3.7',
glide : '4.9.0'
]

def deps = [:]
deps.android_gradle_plugin = "com.android.tools.build:gradle:$versions.android_gradle_plugin"
deps.junit = "junit:junit:$versions.junit"

deps.kotlin = [
plugin: "org.jetbrains.kotlin:kotlin-gradle-plugin:$versions.kotlin",
stdlib: "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$versions.kotlin"
]

deps.x = [
multidex : "androidx.multidex:multidex:2.0.1",
design : "com.google.android.material:material:1.0.0",
app_compat : "androidx.appcompat:appcompat:$versions.support",
recyclerview : "androidx.recyclerview:recyclerview:1.0.0",
constraintlayout: "androidx.constraintlayout:constraintlayout:1.1.3",
viewpager2 : "androidx.viewpager2:viewpager2:$versions.viewpager2",
android_ktx : 'androidx.core:core-ktx:1.0.1'
]

deps.dagger = [
runtime : "com.google.dagger:dagger:$versions.dagger",
compiler : "com.google.dagger:dagger-compiler:$versions.dagger",
android : "com.google.dagger:dagger-android:$versions.dagger",
android_support : "com.google.dagger:dagger-android-support:$versions.dagger",
android_processor: "com.google.dagger:dagger-android-processor:$versions.dagger"
]

deps.rx = [
java : "io.reactivex.rxjava2:rxjava:$versions.rxjava",
android: "io.reactivex.rxjava2:rxandroid:$versions.rxandroid",
kotlin : "io.reactivex.rxjava2:rxkotlin:$versions.rxkotlin"
]

deps.autodispose = [
runtime : "com.uber.autodispose:autodispose:$versions.autodispose",
lifecycle : "com.uber.autodispose:autodispose-lifecycle:$versions.autodispose",
android : "com.uber.autodispose:autodispose-android:$versions.autodispose",
android_arch: "com.uber.autodispose:autodispose-android-archcomponents:$versions.autodispose",
]

deps.okio = "com.squareup.okio:okio:$versions.okio"

deps.okhttp = [
runtime : "com.squareup.okhttp3:okhttp:$versions.okhttp",
logging_interceptor: "com.squareup.okhttp3:logging-interceptor:$versions.okhttp"
]

deps.retrofit = [
runtime : "com.squareup.retrofit2:retrofit:$versions.retrofit",
adapter_rxjava : "com.squareup.retrofit2:adapter-rxjava2:$versions.retrofit",
converter_moshi: "com.squareup.retrofit2:converter-moshi:$versions.retrofit"
]

deps.timber = "com.jakewharton.timber:timber:$versions.timber"

deps.lifecycle = [
runtime : "androidx.lifecycle:lifecycle-runtime:$versions.lifecycle",
extensions : "androidx.lifecycle:lifecycle-extensions:$versions.lifecycle",
java8 : "androidx.lifecycle:lifecycle-common-java8:$versions.lifecycle",
compiler : "androidx.lifecycle:lifecycle-compiler:$versions.lifecycle",
viewmodel_ktx: "androidx.lifecycle:lifecycle-viewmodel-ktx:$versions.lifecycle",
]

deps.moshi = [
runtime : "com.squareup.moshi:moshi:$versions.moshi",
adapters : "com.squareup.moshi:moshi-adapters:$versions.moshi",
kotlin_codegen: "com.squareup.moshi:moshi-kotlin-codegen:$versions.moshi"
]

deps.xcodescanner = "cn.simonlee.xcodescanner:zbar:$versions.xcodescanner"
deps.amap = [
map : "com.amap.api:3dmap:5.0.0",
location: "com.amap.api:location:3.3.0"
]

deps.autosize = "me.jessyan:autosize:$versions.autosize"
deps.rxpermissions = "com.github.tbruyelle:rxpermissions:$versions.rxpermissions"
deps.recyclerviewadapter = "com.github.CymChad:BaseRecyclerViewAdapterHelper:$versions.recyclerviewadapter"
deps.smartrefresh = [
layout: "com.scwang.smartrefresh:SmartRefreshLayout:$versions.smartrefresh",
header: "com.scwang.smartrefresh:SmartRefreshHeader:$versions.smartrefresh"
]
deps.qrcode_zxing = "cn.bingoogolapple:bga-qrcode-zxing:$versions.qrcode_zxing"
//deps.qrcode_zbar = "cn.bingoogolapple:bga-qrcode-zbar:$versions.qrcode_zbar"

deps.pickerview = "cn.carbswang.android:NumberPickerView:1.2.0"

deps.xg = [
xg : "com.tencent.xinge:xinge:4.3.5-release",
jg : "com.tencent.jg:jg:1.1",
wup : "com.tencent.wup:wup:1.0.0.E-Release",
mid : "com.tencent.mid:mid:4.0.7-Release",
xiaomi: "com.tencent.xinge:mipush:4.3.2-xiaomi-release",
meizu : "com.tencent.xinge:xgmz:4.3.2-meizu-release",
huawei: "com.tencent.xinge:xghw:4.3.2-huawei-release"
]

deps.glide = [
glide : "com.github.bumptech.glide:glide:$versions.glide",
compiler: "com.github.bumptech.glide:compiler:$versions.glide"
]

deps.numberbutton = 'ren.qinc.numberbutton:numberbutton:0.0.1'
deps.androidutilcode = 'com.blankj:utilcodex:1.24.7'
deps.updatesdk = 'com.pgyersdk:sdk:3.0.5'

ext.deps = deps
ext.build_versions = [
min_sdk : 19,
target_sdk : 28,
version_code: 10007,
version_name: "0.1.7",
jvmTarget : '1.8',
build_tools_sdk : "28.0.3"
]


static def addRepos(RepositoryHandler handler) {
handler.google()
handler.mavenCentral()
handler.jcenter() { url "https://jcenter.bintray.com/" }
handler.maven { url "https://raw.githubusercontent.com/Pgyer/mvn_repo_pgyer/master" }
handler.maven { url 'https://oss.sonatype.org/content/repositories/snapshots' }
handler.maven { url "https://kotlin.bintray.com/kotlinx/" }
handler.maven { url "https://jitpack.io" }
// For kotlinx-metadata-jvm used by Room 2.1.0 (KT-27991)
}

ext.addRepos = this.&addRepos
Read more »

TabLayout在设置TabLayout.addTab()不显示的问题

TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.addTab(tabLayout.newTab().setText("Tab"));


     /**
       * The one-stop shop for setting up this {@link TabLayout} with a {@link ViewPager}.
       *
       * <p>This method will link the given ViewPager and this TabLayout together so that any
       * changes in one are automatically reflected in the other. This includes adapter changes,
       * scroll state changes, and clicks. The tabs displayed in this layout will be populated
       * from the ViewPager adapter's page titles.</p>
       *
       * <p>After this method is called, you will not need this method again unless you want
       * to change the linked ViewPager.</p>
       *
       * <p>If the given ViewPager is non-null, it needs to already have a
       * {@link PagerAdapter} set.</p>
       *
       * @param viewPager The ViewPager to link, or {@code null} to clear any previous link.
       */

  public void setupWithViewPager(@Nullable final ViewPager viewPager) {
      if (mViewPager != null && mPageChangeListener != null) {
          // If we've already been setup with a ViewPager, remove us from it
          mViewPager.removeOnPageChangeListener(mPageChangeListener);
      }

    if (viewPager != null) {
        final PagerAdapter adapter = viewPager.getAdapter();
        if (adapter == null) {
            throw new IllegalArgumentException("ViewPager does not have a PagerAdapter set");
        }

        mViewPager = viewPager;

        // Add our custom OnPageChangeListener to the ViewPager
        if (mPageChangeListener == null) {
            mPageChangeListener = new TabLayoutOnPageChangeListener(this);
        }
        mPageChangeListener.reset();
        viewPager.addOnPageChangeListener(mPageChangeListener);

        // Now we'll add a tab selected listener to set ViewPager's current item
        setOnTabSelectedListener(new ViewPagerOnTabSelectedListener(viewPager));

        // Now we'll populate ourselves from the pager adapter
        setPagerAdapter(adapter, true);
    } else {
        // We've been given a null ViewPager so we need to clear out the internal state,
        // listeners and observers
        mViewPager = null;
        setOnTabSelectedListener(null);
        setPagerAdapter(null, true);
    }
}
Read more »

final finally finalize 区别及用法

final
1,final修饰的class,代表不可以继承扩展。

2、final的方法也是不可以重写的。

3、final修饰的变量是不可以修改的。这里所谓的不可修改对于基本类型来来,的确是不可以修改。而对于引用类型来说,只能说不能重新赋值。也就是不能改变引用地址。但是作为引用类型,它内部所包含的内容如果不是final则可以随意修改

Read more »