Handler的機制:
我在學習和使用handler的時候,對與它相關的源代碼進行的研究,說到handler機制,就要涉及到5個類,Handler、MessageQueue、Looper、HandlerThread、Message;
Message(消息)
消息的類型,在
Handler 類中的 handleMessage 方法中得到單個的消息進行處理
它由MessageQueue統一列隊,由Handler處理。
Handler
是處理者,他負責發送和處理Message消息。
可以發佈或者處理一個消息或者操作一個 Runnable,通過 Handler 發佈消息,消息將只會發送到與它關聯的消息隊列 , 然也只能處理該消息隊列中的消息
MessageQueue(消息隊列)
它用來存放Handler發送過來的隊列,並且按照先入先出的規則執行。
用來存放通過 Handler 發佈的消息,通常附屬於某一個創建它的線程,可以通過 Looper.myQueue() 得到當前線程的消息隊列
Looper
是 Handler 和消息隊列之間通訊橋樑, 程序組件首先通過 Handler 把消息傳遞給 Looper, Looper 把消息放入隊列。 Looper 也把消息隊列裏的消息廣播給所有的 。
一個線程可以產生一個Looper對象,由它來管理此線程裏的Message Queue(消息隊列)。
Looper 的作用就像抽水的水泵,它不斷的從MessageQueue中去抽取Message並執行。
HandlerThread線程,是消息循環的執行場所。
圖1.Handler機制
知道了這幾個類就可以說說消息機制的原理了,在創建Activity之前,當系統啓動的時候,先加載ActivityThread類(主線程或者UI線程),在這個類的main函數中,調用Looper.prepareMainLooper()進行初始化Looper對象,然後創建主線程的handler對象,隨後才創建ActivityThread對象,最後調用Looper.loop()方法,不斷的進行輪詢消息隊列中的消息。也就是說,在ActivityThread和Activity創建之前,就已經開啓了Looper的loop()方法,不斷的進行輪詢消息。
我們可以通過圖1流程圖來說明handler機制的原理:
我們通過Message.obtain()獲取Message對象並準備消息數據之後。
1、使用sendMessage():通過Handler將消息發送給MessageQueue消息隊列
2、在發送消息的時候,使用message.target=this爲handler發送的message貼上當前handler的標籤。
3、開啓HandlerThread線程,執行run方法。
4、在HandlerThread類的run方法中開啓輪詢器進行輪詢:調用Looper.loop()方法進行輪詢消息隊列的消息
5、在消息隊列MessageQueue中enqueueMessage(Message msg, long when)方法裏,對消息進行入列,即依據傳入的時間進行消息入列(排隊)
6、輪詢消息:與此同時,Looper在不斷的輪詢消息隊列。
7、在Looper.loop()方法中,獲取到MessageQueue對象後,從中取出消息(Message msg = queue.next()),如果沒有消息會堵塞
8、分發消息:從消息隊列中取出消息後,調用msg.target.dispatchMessage(msg);進行分發消息
9、將處理好的消息分發給指定的handler處理,即調用了handler的dispatchMessage(msg)方法進行分發消息。
10、在創建handler時,複寫的handleMessage方法中進行消息的處理
11、回收消息:在消息使用完畢後 (Handler 處理完該 Message (update UI) 後),Looper 則設置該 Message 爲 NULL,以便回收!在Looper.loop()方法中調用msg.recycle(),將消息進行回收,即將消息的所有字段恢復爲初始狀態。
附加: