Handler原理之流程圖分析(面試殺手,源碼級分析)

一.Handler在不同線程之中的創(chuàng)建
主線程:


WechatIMG16268.png

子線程:


WechatIMG16210.png

消息處理流程:


WechatIMG16213.png

二.帶著問題去總結(jié)
(一). Handler的意義
Hander本身就是一個大熔爐,將Looper,Message,MessageQueue,ThreadLocal維護(hù)起來的,形成一個完整的消息通信機(jī)制,handler創(chuàng)建在哪個線程中,并且初始化當(dāng)前線程的looper,可以在別的線程中,通過此handler發(fā)送消息,在創(chuàng)建線程中接收消息,達(dá)到消息通信的效果

(二).Looper和MessageQueue的關(guān)系:
Looper.prepare() 執(zhí)行的時候分為三步:
一.Looper和MessageQueue的關(guān)系:Looper.prepare() 執(zhí)行的時候分為三步:
1.判斷當(dāng)前線程是否已經(jīng)存在looper
2.初始化looper,并且初始化MessageQueue
3.利用初始化的成員變量ThreadLocal的set方法傳入Looper對象,并且用ThreadLocalMap將looper和當(dāng)前ThreadLocal進(jìn)行綁定,set方法中將Thread中的成員變量 ThreadLocal.ThreadLocalMap threadLocals 賦值,所以在ThreadLocal的get方法中可以取出當(dāng)前Thread對應(yīng)的ThreadLocalMap,然后就Looper就可以通過get方法通過線程池拿到當(dāng)前thread對應(yīng)的loop

(三).message是和MessageQueue的關(guān)系,message在消息通信的過程中經(jīng)歷了哪些過程?
Handler調(diào)用sendMessage方法去發(fā)送消息,幾個發(fā)送消息的方法最后都執(zhí)行了enqueueMessage(@NonNull MessageQueue queue, @NonNull Message msg, long uptimeMillis)
最后執(zhí)行到MessageQueue中的enqueueMessage方法以鏈表的形式來到MessageQueue中,通過Looper.loop()中的死循環(huán)不斷從MessageQueue的next()方法中取出message,最后利用message對應(yīng)的target(handler)來dispatchMessage(msg)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容