Handler的機制

Handler的機制:


我在學習和使用handler的時候,對與它相關的源代碼進行的研究,說到handler機制,就要涉及到5個類,HandlerMessageQueueLooper、HandlerThreadMessage


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()方法,不斷的進行輪詢消息隊列中的消息。也就是說,在ActivityThreadActivity創建之前,就已經開啓了Looperloop()方法,不斷的進行輪詢消息。


我們可以通過圖1流程圖來說明handler機制的原理:

我們通過Message.obtain()獲取Message對象並準備消息數據之後。

1、使用sendMessage():通過Handler將消息發送給MessageQueue消息隊列

2、在發送消息的時候,使用message.target=thishandler發送的message貼上當前handler的標籤。

3、開啓HandlerThread線程,執行run方法。

4、在HandlerThread類的run方法中開啓輪詢器進行輪詢:調用Looper.loop()方法進行輪詢消息隊列的消息

5、在消息隊列MessageQueueenqueueMessage(Message msg, long when)方法裏,對消息進行入列,即依據傳入的時間進行消息入列(排隊)

6、輪詢消息:與此同時,Looper在不斷的輪詢消息隊列。

7、在Looper.loop()方法中,獲取到MessageQueue對象後,從中取出消息(Message msg = queue.next()),如果沒有消息會堵塞

8、分發消息:從消息隊列中取出消息後,調用msg.target.dispatchMessage(msg);進行分發消息

9、將處理好的消息分發給指定的handler處理,即調用了handlerdispatchMessage(msg)方法進行分發消息。

10、在創建handler時,複寫的handleMessage方法中進行消息的處理

11、回收消息:在消息使用完畢後 (Handler 處理完該 Message (update UI) 後),Looper 則設置該 Message 爲 NULL,以便回收!在Looper.loop()方法中調用msg.recycle(),將消息進行回收,即將消息的所有字段恢復爲初始狀態。

 

附加:

三個判斷,優先級從高到低:
1) Message 裏面的 Callback,一個實現了 Runnable 接口的對象,其中 run 函數做處理工作;
2) Handler 裏面的 mCallback 指向的一個實現了 Callback 接口的對象,由其 handleMessage 進行處理;
3) 處理消息 Handler 對象對應的類繼承並實現了其中 handleMessage 函數,通過這個實現的 handleMessage 函數處理消息。
由此可見,我們實現的 handleMessage 方法是優先級最低的!


最簡單的方法 ——判斷 Handler 對象裏面的 Looper 對象是屬於哪條線程的,則由該線程來執行! 
1. 當 Handler 對象的構造函數的參數爲空,則爲當前所在線程的 Looper;
2. Looper.getMainLooper()得到的是主線程的 Looper 對象,Looper.myLooper()得到的是當前線程的 Looper 對象

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章