在Android中,主線程與子線程的交互,例如在子線程進行網絡請求,請求後將數據更新到View上,咱們經常使用Handler或者AsyncTask。HandlerThread與它們的區別在於會建立工做線程、Hanlder和Looper。這樣就不用在主線程建立Handler或者AsyncTask的硬性要求。能夠說HandlerThread是Handler的應用場景。bash
HandlerThread繼承至Thread,因此自己也是一個線程。先擼代碼爲敬,下面是通常例子代碼。網絡
HandlerThread handlerThread = new HandlerThread("handler");
handlerThread.start();
Handler workerHandler = new Handler(handlerThread.getLooper()) {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//doSomething
}
};
workerHandler.post(new Runnable() {
@Override
public void run() {
//doSomething
}
});
複製代碼
在HandlerThread構造方法中能夠隨意傳入一個字符串,該字符串只用於區別不一樣線程而已,方便在jstack分析或者問題定位,這裏是handler
。接着將HandlerThread對象的Looper對象做爲Handler的參數,新建Handler對象。這樣就將工做線程的Looper和Handler綁定在一塊兒了,也就是工做線程和Handler綁定在一塊兒了。經過Handler對象發送消息或者任務到Looper對象中的消息隊列,在工做線程中處理消息或任務。ide
若是再也不使用工做線程,建議調用HandlerThread對象的quitSafely
方法退出,避免不要的資源浪費。oop
在理解了Android的消息機制以後,ThreadHandler的原理能夠說很是的簡單,只是Android消息機制的一個應用。源碼分析
public HandlerThread(String name) {
super(name);
mPriority = Process.THREAD_PRIORITY_DEFAULT;
}
public HandlerThread(String name, int priority) {
super(name);
mPriority = priority;
}
複製代碼
HandlerThread有兩個重載構造器,一個是使用線程默認優先級的構造器,一個是能夠供用戶本身定義線程優先權的構造器。post
在線程中,調用Thread對象的start方法,最終會run方法。而HandlerThread重寫了run方法。ui
@Override
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}
複製代碼
在run方法中,主要是建立了Looper對象,並啓動循環。onLooperPrepared方法是受保護的空方法,能夠經過繼承HandlerThread重寫該方法,在開啓消息循環前作一些準備。this
若是對於Looper和Handler比較陌生,能夠查看Android的消息機制spa
知識點分享線程