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

子線程:

消息處理流程:

二.帶著問題去總結(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)