簡單的說,Handler獲取當前線程中的looper對象,looper用來存放從MessageQueue中取出的Message,再由Handler進行Message分發和處理,按照先進先出執行。
MessageQueue(消息隊列):用來存放通過Handler發送的消息,通常附屬於某一個創建它的線程,可以通過Looper.myQueue()得到當前線程的消息隊列。
Handler:是Message的主要處理者,負責Message的發送,Message內容的執行處理。例如將消息發送到消息隊列(sendMessage),更新UI組件(實現該類的handleMessage方法)
Looper:是Handler和消息隊列之間的通訊橋梁,程序組件首先通過Handler把消息傳遞給Looper,Looper把消息放到隊列。Looper也把消息隊列里的消息廣播給所有的Looper。
Message:消息的類型,理解為線程間交流的信息,處理數據后台線程需要更新UI,在Handler類中的handleMessage方法中得到單個的消息進行處理。
Handler機制的大致流程:
1.在Looper.loop()方法運行開始后,循環的按照接收順序取出MessageQueue里面的非NULL的Message。
2.一開始MessageQueue里面的Message都是NULL的,當Handler.sendMessage(Message)到MessageQueue,該函數里面設置了那個Message對象的target屬性是當前Handler對象。隨后Looper取出了那個Message,則調用該Message的target指向的Handler的dispatchMessage函數對Message進行處理。在dispatchMessage方法里,如何處理Message則由用戶指定,三個判斷,優先級從高到低:
1)Message里面的Callback,一個實現了Runnable接口的對象,其中run函數做處理工作
2)Handler里面的mCallback指向的一個實現了Callback接口的對象,由其handleMessage進行處理。
3)處理消息Handler對象對應的類繼承並實現了其中handleMessage函數,通過這個實現的handleMessage函數處理消息。
4)Handler處理完該Message后,Looper則設置該Message為NULL,以便回收。