在Android中使用Handler不僅可以直接post
發送消息,還可以通過postDelayed
設定延遲時間,來延遲執行消息任務。那么這后面的機制是如何處理的呢?
首先查看Handler的源碼,會發現post
和postDelayed
內部均調用的同一方法sendMessageDelayed
:
在這里的不同是當調用post時,延遲時間傳入的是0。
下一步,sendMessageDelayed
中:
將小于0的異常延遲時間置為0,接下來將延遲時間與SystemClock.uptimeMillis()
相加,最終調用sendMessageAtTime
。 這一步的時間轉換,將延遲時間這個相對值,轉化為了系統啟動后的一個絕對值時間,之后framework中的處理均是在絕對值上進行比較。
再繼續追蹤源碼,handler最終會調用MessageQueue
中的方法,將消息添加到隊列中:
進一步分析MessageQueue
中的enqueueMessage
方法,代碼比較長,但是邏輯不復雜,添加到隊列的代碼主要是這一部分:
1.在消息對象msg中包含一個when變量,保存的就是該消息應執行的時間(剛才轉化后的絕對值時間)。 2.mMessages
是MessageQueue
類中的一個全局變量,指向的是消息隊列中的頭節點。因此我們看到判斷邏輯前,先將mMessages
引用賦值給了變量p
。 3.接下來,若消息隊列中沒有任何消息(p=null
),或絕對時間為0,亦或這條消息執行時間在當前隊列第一條消息之前,那么將這條消息添加到隊列開始的位置; 不滿足這些條件時,用一個很典型的鏈表插入算法,將消息按時間順序添加到列表中。
新聞熱點
疑難解答