
前言
知識(shí)儲(chǔ)備:手撕Handler
面試題庫(kù):泓洋大神等人的Github項(xiàng)目
雖然HandlerThread其實(shí)在我的項(xiàng)目中并沒(méi)有使用到過(guò),而我現(xiàn)在也是準(zhǔn)備面試的一個(gè)階段,學(xué)的多也總是沒(méi)有壞處。
基礎(chǔ)用法
// 創(chuàng)建Handler實(shí)例
HandlerThread handlerThread = new HandlerThread("MainActivity");
// 線程啟動(dòng)
handlerThread.start();
// 基于HandlerThread構(gòu)建的Looper
Handler handler = new Handler(handlerThread.getLooper()){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
Log.e(TAG, msg.what+"");
}
};
// 使用handler發(fā)送消息
handler.sendEmptyMessage(1);
// 退出Lopper的死循環(huán)
handlerThread.quit();
揭秘HandlerThread
先看看HandlerThread的家庭里有哪些成員呢?
// 一個(gè)繼承自Thread的類
public class HandlerThread extends Thread {
int mPriority; // 優(yōu)先級(jí)
int mTid = -1;
Looper mLooper; // Looper
private @Nullable Handler mHandler; // Handler
}
主要的已經(jīng)標(biāo)示出解釋,因?yàn)樵谥暗?a href="http://www.itdecent.cn/p/f0cb15862eb4" target="_blank">手撕Handler已經(jīng)比較全面的講解過(guò)了Handler以及Looper的作用,這里我們應(yīng)該也能比較清晰的知道HandlerThread的組成成分應(yīng)該是Handler+Thread。
之前在手撕Handler的講解中,Looper指的是在ActivityThread中定義的,也就是一個(gè)全局型的Looper,并且他的初始化是如下所示的。
Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message msg) {
return false;
}
});
而這個(gè)初始化函數(shù)最后調(diào)用的Looper也就是我們指的一個(gè)全局的Looper。
下面給出這個(gè)構(gòu)造函數(shù)調(diào)用的代碼。
public Handler(@Nullable Callback callback, boolean async) {
if (FIND_POTENTIAL_LEAKS) {
final Class<? extends Handler> klass = getClass();
if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&
(klass.getModifiers() & Modifier.STATIC) == 0) {
Log.w(TAG, "The following Handler class should be static or leaks might occur: " +
klass.getCanonicalName());
}
}
mLooper = Looper.myLooper(); // 獲得ActivityThread中初始化的Looper
if (mLooper == null) {
throw new RuntimeException(
"Can't create handler inside thread " + Thread.currentThread()
+ " that has not called Looper.prepare()");
}
mQueue = mLooper.mQueue;
mCallback = callback;
mAsynchronous = async;
}
這就是HandlerThread中的Handler和上述定義的Handler的區(qū)別了,但是他們的工作原理是一致的,只是變化了Looper。
使用HandlerThread的優(yōu)缺點(diǎn)
使用場(chǎng)景:?jiǎn)尉€程+異步任務(wù)場(chǎng)景
優(yōu)點(diǎn):
- 將loop運(yùn)行在子線程中處理,減輕了主線程的壓力,使主線程更流暢
- 串行執(zhí)行,開(kāi)啟一個(gè)線程起到多個(gè)線程的作用
- 有自己的消息隊(duì)列,不會(huì)干擾UI線程
缺點(diǎn):
- 由于每一個(gè)任務(wù)隊(duì)列逐步執(zhí)行,一旦隊(duì)列耗時(shí)過(guò)長(zhǎng),消息延時(shí)
- 對(duì)于IO等操作,線程等待,不能并發(fā)
以上就是我的學(xué)習(xí)成果,如果有什么我沒(méi)有思考到的地方或是文章內(nèi)存在錯(cuò)誤,歡迎與我分享。
相關(guān)文章推薦:
手撕OkHttp
手撕AsyncTask
手撕ButterKnife
手撕Handler