版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/devallever/article/details/78413026
HandlerThread簡介
HandlerThread繼承了Thread,它是一種可以使用Handler的Thread,它的實現就是在run()方法中通過Looper.prepare()創建消息隊列,並通過Looper.loop()開啓消息循環。這樣在實際使用中就允許在HandlerThread中創建Handler了。
由於HandlerThread的run()方法是一個無限循環,因此當明確不需要使用HandlerThread的時候可以通過Looper的quit()或quitSafely()來終止線程執行。
使用Handler
通常我們會在主線程中創建Handler,在子線程中調用handler.post(runnable)傳遞消息到主線程的消息隊列中處理runnable的run方法.這樣完成了子線程到主線的切換。
在onCreate()方法中
mainHandler = new Handler();
然後在子線程中post
btn_post_to_main_thread.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
Log.d(TAG, "Thread id = " + Thread.currentThread().getId());
mainHandler.post(runnable);
}
}).start();
}
});
runnable
private Runnable runnable = new Runnable() {
@Override
public void run() {
Log.d(TAG, "Thread id = " + Thread.currentThread().getId());
}
};
運行結果
HandlerThreadActivity: Thread id = 10383
HandlerThreadActivity: Thread id = 1
使用HandlerThread
先創建HandlerThread實例,在onCreate()方法中
handlerThread = new HandlerThread("handlerThread");
handlerThread.start();
這樣就開啓了一個帶Looper的子線程,因爲HandlerThread是繼承自Thread,它的run方法是這樣定義的
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}
關於Looper原理,可以參考《Android開發藝術探索》中的消息機制,我的理解是:
- Looper.prepare();創建Looper實例
- Looper.loop();進入一個無限循環中,不斷監聽消息隊列中是否有消息,有則把他取出來分發給handler的handlerMessage()中處理。
因爲線程中需要有一個Looper,線程綁定的handler纔可以發送消息到消息隊列中,那麼相應的線程纔會得到處理。
然後就是利用handlerThread獲取到Looper用來創建Handler實例
handler = new Handler(handlerThread.getLooper());
此時這個handler即使實在主線程中創建,但是它與子線程的Looper關聯了,所以處理消息時候也會在子線程中處理的
btn_post_to_sub_thread.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
handler.post(runnable);
}
});
運行結果:
HandlerThreadActivity: Thread id = 10382
HandlerThreadActivity: Thread id = 10382
HandlerThreadActivity: Thread id = 10382
可以知道是在子線程中處理的。
HandlerThread和Thread的區別
- 普通Thread主要用於在run()方法中執行一個耗時的任務
- HandlerThread內部創建消息隊列,需要handler消息方式來通知HandlerThread去執行一個具體的任務。