詳解Android Handler機制和原理(一)

Handler的使用

在Android開發中,Handler機制是一個很重要的知識點,主要用於訊息通訊。

Handler使用的三大步驟:

1、Loop。prepare()。

2、new一個Handler物件,並重寫handleMessage方法。

3、Loop。loop()。

先執行例項程式碼觀察現象,再深入分析內部原理。

編譯執行程式,輸出如下:

Loop。prepare方法內部實現原理

瞭解某個方法具體做了什麼,最好的方法就是追蹤下去看原始碼。我們跟隨IDE一步一步檢視Loop。prepare到底做了什麼。

sThreadLocal是一個ThreadLocal型別變數,且ThreadLocal是一個模板類。Loop。prepare最終建立一個新的Looper物件,且物件例項被變數sThreadLocal引用。繼續追蹤下去,檢視Looper構造方法做了什麼操作。

到這裡我們已經很清楚,Looper構造方法主要是建立一個MessageQueue,且MessageQueue構造方法呼叫native方法獲取底層queue的指標,mQuitAllowed值為true表示允許退出loop,false表示無法退出loop。結合前面Looper。prepare方法內部程式碼,表示我們建立的Looper允許退出loop。

new一個Handler物件例項,到底做了什麼?

Handler還有其他構造方法,這裡我們呼叫其中一種構造方法建立一個Handler物件例項。該構造方法要求傳入一個Looper物件例項和CallBack物件例項。回顧一下最開始的例子程式碼,我們傳入的形參,一個是由Looper。myLooper方法獲取的Looper物件例項,另外一個則是Callback匿名類。我們先看看Looper。myLooper到底獲取到了什麼。

這裡獲取到的就是前面Looper。prepare方法新建立的Looper物件例項,所以Looper。prepare方法必須在建立Handler物件例項之前呼叫。再回到Handler構造方法裡,有幾個地方很關鍵:

1、Handler內部儲存了Looper物件引用。

2、Handler內部儲存了Looper內部的MessageQueue物件引用。

3、Handler內部儲存了Callback物件引用。

4、mAsyncchronous值為true表示handleMessage方法非同步執行,false表示同步執行。

Looper。loop方法內部實現原理

程式碼較長,我們只取關鍵程式碼閱讀。透過myLooper獲取新建立的Looper物件例項,進而獲取Looper內部的MessageQueue物件例項。然後進入死迴圈中不斷呼叫MessageQueue類的next方法獲取MessageQueue裡的message,然後呼叫dispatchMessage進行訊息分發,最後由handleMessage進行訊息處理。到這裡Looper、MessageQueue和Handler之間的關係就建立起來了。介於篇幅,傳送訊息和訊息處理原理,下篇文章詳細分析。

TAG: LooperHandler例項物件構造方法