知識儲備:手撕Handlerjava
面試題庫:泓洋大神等人的Github項目git
雖然HandlerThread其實在個人項目中並無使用到過,而我如今也是準備面試的一個階段,學的多也老是沒有壞處。github
// 建立Handler實例
HandlerThread handlerThread = new HandlerThread("MainActivity");
// 線程啓動
handlerThread.start();
// 基於HandlerThread構建的Looper
Handler handler = new Handler(handlerThread.getLooper()){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
Log.e(TAG, msg.what+"");
}
};
// 使用handler發送消息
handler.sendEmptyMessage(1);
// 退出Lopper的死循環
handlerThread.quit();
複製代碼
先看看HandlerThread的家庭裏有哪些成員呢?面試
// 一個繼承自Thread的類
public class HandlerThread extends Thread {
int mPriority; // 優先級
int mTid = -1;
Looper mLooper; // Looper
private @Nullable Handler mHandler; // Handler
}
複製代碼
主要的已經標示出解釋,由於在以前的手撕Handler已經比較全面的講解過了Handler
以及Looper
的做用,這裏咱們應該也能比較清晰的知道HandlerThread
的組成成分應該是Handler
+Thread
。編程
以前在手撕Handler的講解中,Looper
指的是在ActivityThread
中定義的,也就是一個全局型的Looper
,而且他的初始化是以下所示的。多線程
Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message msg) {
return false;
}
});
複製代碼
而這個初始化函數最後調用的Looper
也就是咱們指的一個全局的Looper
。 下面給出這個構造函數調用的代碼。併發
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
的區別了,可是他們的工做原理是一致的,只是變化了Looper
。異步
使用場景:單線程+異步任務場景async
優勢:ide
缺點:
以上就是個人學習成果,若是有什麼我沒有思考到的地方或是文章內存在錯誤,歡迎與我分享。
相關文章推薦: