1、HandlerThread在run中調(diào)用了Looper.prepare();初始化Looper;
2、再通過Looper的myLooper()獲取這個初始化的Looper。而Looper的構(gòu)造當(dāng)中省撑,初始化了MessageQueue,并獲得當(dāng)前線程。
3谎柄、Looper.prepare()中丁侄,將Looper放進(jìn)ThreadLocal中惯雳,ThreadLocal存儲了一份變量朝巫。。
4石景、接著 這里調(diào)用了 notifyAll(); 喚醒所有的線程劈猿?---在getLooper中有個wait,如果你get的話潮孽,會get不到揪荣,需要等到notifyAll執(zhí)行完后,才能獲取到往史,解決同步問題仗颈。
5、然后調(diào)用Looper.loop();? 運(yùn)行這個線程的消息隊(duì)列
6、這里會獲取到Looper和MessageQueue挨决,獲取MessageQueue中的Message请祖,然后通過Handler處理message。這行代碼:msg.handler.dispatchMessage(msg);
總結(jié):在Activity中脖祈,有系統(tǒng)的Looper肆捕,所以在子線程中執(zhí)行耗時的操作后,
Activity通過Handler盖高,使用Looper在MessageQueue中獲取Message慎陵,進(jìn)行處理。
而在子線程中喻奥,需要達(dá)到這種效果席纽,需要在子線程中創(chuàng)建Handler的Looper,于是就有了封裝了Looper的thread撞蚕,為HandlerThread胆筒。