創建訊息
每一個訊息都需要被指定的Handler處理,通過Handler創建訊息便可以完成此功能。Android訊息機制中引入了訊息池。Handler創建訊息時首先查詢訊息池中是否有訊息存在,如果有直接從訊息池中取得,如果沒有則重新初始化一個訊息實例。使用訊息池的好處是:訊息不被使用時,並不作為垃圾回收,而是放入訊息池,可供下次Handler創建訊息時使用。訊息池提高了訊息對象的復用,減少系統垃圾回收的次數。訊息的創建流程如圖所示。
傳送訊息
UI主執行緒初始化第一個Handler時會通過ThreadLocal創建一個Looper,該Looper與UI主執行緒一一對應。使用ThreadLocal的目的是保證每一個執行緒只創建唯一一個Looper。之後其他Handler初始化的時候直接獲取第一個Handler創建的Looper。Looper初始化
的時候會創建一個訊息佇列MessageQueue。至此,主執行緒、訊息循環、訊息佇列之間的關係是1:1:1。Handler、Looper、MessageQueue的初始化流程如圖所示:
Hander持有對UI主執行緒訊息佇列MessageQueue和訊息循環Looper的引用,子執行緒可以通過Handler將訊息傳送到UI執行緒的訊息佇列MessageQueue中。
處理訊息
UI主執行緒通過Looper循環查詢訊息佇列UI_MQ,當發現有訊息存在時會將訊息從訊息佇列中取出。首先分析訊息,通過訊息的參數判斷該訊息對應的Handler,然後將訊息分發到指定的Handler進行處理。
子執行緒通過Handler、Looper與UI主執行緒通信的流程如圖所示。