(筆記)關於Handler機制中looper Message的一些理解

handler在接受/處理消息需要looper來管理,每個主線線程在創建開始都會自動創建一個looper,通過Looper.loop(); 來進行消息循環,對整個activity的生命週期中的事件進行接收和處理。

Looper在創建開始的構造方法中創建了關聯的MessageQueue,它是以隊列形式管理Message,發送無延時的message是先進先出,但是通過sendMessageAtFrontOfQueue()可以把消息放到頭部優先執行,而且message有延時發送這個形式,因爲其內部是通過單鏈表來儲存message的,方便插入和刪除消息。

消息隊列工作流程:如果發送一個延時10s的消息A放到隊列中,looper開始循環所以MessageQueue發現這是個延時消息,保存延時時間,調用
nativePollOnce(ptr, nextPollTimeoutMillis)阻塞(這個nextPollTimeoutMillis參數就是阻塞時間,方法會在時間到時喚醒線程),Looper阻塞,不對A進行處理,此時又有一個延時5s的消息B要加入隊列,判斷A還未到時間,把B插入到隊列頭部(A的前面),調用nativeWake()方法喚醒線程,之後MessageQueue發現B也是個延時消息,同A一樣處理,現在把無延時消息C加入隊列,根據mBlocked標識判斷隊列中有消息未到時間在阻塞當中,把C插入頭部,喚醒線程,looper處理,並把C移除隊列,之後looper又開始循環調用next();MessageQueue發現B沒到時間繼續阻塞,looper阻塞,一直到到B時發現時間到了,喚醒線程,就把B處理並移除,A也同B一樣,此時looper循環發現隊列中沒有消息了就一直阻塞不再循環,知道有新消息插入再次喚醒。

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