從handler.sendMessage()作為入口來分析:
1、Handler的sendMessage -> sendMessageDelay -> sendMessageAtTime;
2、可以看到最后調用sendMessageAtTime的方法,它的作用就是把Message.target = this 讓Message先持有Handler對象,然后傳給MessageQueue.enqueueMessage
3、enqueueMessage方法通過比較把Message加入到mMessage鏈表里面,這時候Message.when持有執行的時間,Message.next持有下一個消息
4、通過MessageQueue的注解可以看到Looper調用了它
5、Looper通過PRepare方法把自身傳遞個ThreadLocal對象,這個對象給維護Looper和線程的對應管線。(當前app的線程和looper映射關系都由ThreadLocal維護)
6、Looper調用loop方法,看到一個Looper持有一個MessageQueue對象,然后取出mMssage執行:
7、Message.target持有的handler對象再調用dispatchMessage傳給handleMessage或者handleCallback回調接口實現功能
源碼中Handler,MessageQueue,Looper,ThreadLocal類的注解,非常說明其作用;
新聞熱點
疑難解答