講講Handler實現原理

早起的部落格發表於2020-11-02

各主要類作用:

Handler:負責傳送訊息及處理訊息
Looper:複製不斷的從訊息佇列中取出訊息,並且給傳送本條訊息的Handler
MessageQueue:負責儲存訊息
Message:訊息本身,負責攜帶資料

分發流程:

初始化訊息佇列,建立messageQueue並繫結到Looper上。

Handler的sendMessage發起訊息處理流程開端,建立Message並放入到MessageQueue中,由Looper的無限迴圈任務喚醒阻塞,開始分發Message,執行Message的Runable之後,呼叫儲存的handler的handleMessage方法,回到handler實現結束訊息流程。

 

主要類的關聯關係:

ThreadLocal中獲取Looper物件,說明Looper是執行緒獨立的,即主執行緒(MainThread)持有。

MessageQueue是在Looper的構造方法建立,說明Looper是關聯的MessageQueue的。採用next持有message物件引用,形成連結串列實現。

Looper的loop方法,發起for(;;)無限迴圈,在message.next()中或者沒有物件阻塞,或者有物件進行message執行。

Message中callback儲存runable物件用來執行,next儲存下一個message用來實現連結串列,target用來執行runable的run方法。

 

延申問題:

那麼,loop的for(;;)會阻塞執行緒,那麼主執行緒是如何在阻塞時接觸阻塞的呢?按上面的說法是沒有其他執行緒進行喚醒操作的

相關文章