handler機制的原理

2022-03-29 18:43:00 字數 1503 閱讀 1901

andriod提供了handler 和 looper 來滿足執行緒間的通訊。handler先進先出原則。looper類用來管理特定執行緒內物件之間的訊息交換(messageexchange)。

1)looper: 乙個執行緒可以產生乙個looper物件,由它來管理此執行緒裡的messagequeue(訊息佇列)。

2)handler: 你可以構造handler物件來與looper溝通,以便push新訊息到messagequeue裡;或者接收looper從message queue取出)所送來的訊息。

3) message queue(訊息佇列):用來存放執行緒放入的訊息。

4)執行緒:uithread 通常就是main thread,而android啟動程式時會替它建立乙個messagequeue。

1.handler建立訊息

每乙個訊息都需要被指定的handler處理,通過handler建立訊息便可以完成此功能。android訊息機制中引入了訊息池。handler建立

訊息時首先查詢訊息池中是否有訊息存在,如果有直接從訊息池中取得,如果沒有則重新初始化乙個訊息例項。使用訊息池的好處是:訊息不被使用時,並不作為垃

圾**,而是放入訊息池,可供下次handler建立訊息時使用。訊息池提高了訊息物件的復用,減少系統垃圾**的次數。訊息的建立流程如圖所示。

2.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中。

3.handler處理訊息

ui主線程通過looper迴圈查詢訊息佇列ui_mq,當發現有訊息存在時會將訊息從訊息佇列中取出。首先分析訊息,通過訊息的引數判斷該訊息對應的handler,然後將訊息分發到指定的handler進行處理。

子執行緒通過handler、looper與ui主線程通訊的流程如圖所示。

handler機制原理全面整理

1 handler用的最多是子執行緒傳送訊息到主線程修改ui 2 首先通過message中的obtain 從訊息池中獲取訊息物件 3 然後要建立handler物件,在handler的構造方法中就會得到輪詢器looper和訊息佇列,這個looper物件和訊息佇列是主線程建立的時候建立的,輪詢器就不斷的...

handler機制原理 看完就明白系列

handler handler new handler message msg handler.obtainmessage handler.sendmessage msg 1 第一步 建立handler 物件,new handler public class handler public handl...

handler通訊機制

android應用開發有個預設規則,不在ui執行緒做耗時操作。耗時操作結果反饋給使用者也不能直接更新ui。耗時操作必須開子執行緒去做,實現的方式很多,handler asynctask service。每個人偏好不同,但是各有各的優點,根據不同的需求選擇適當的實現方式,是我一直追求的目標,每一種至少...