Handler機制整理

2021-08-04 03:32:10 字數 2454 閱讀 2057

handler機制整理

目錄介紹

1.關於handler訊息機制圖

2.關於handler基本介紹

3.使用handler的幾種方法

4.關於handler底層原始碼解讀

1.關於handler訊息機制圖

2.關於handler機制基本解讀

message

訊息,其中包含了訊息id,訊息處理物件以及處理的資料等,由messagequeue統一列隊,終由handler處理。

sendmessage(message);                                    //傳送訊息

sendemptymessage(0); //其實內部實現還是和上面一樣

endemptymessageattime(int what, long uptimemillis); //定時傳送空訊息

sendemptymessagedelayed(int what, long delaymillis); //延時傳送空訊息

sendmessageattime(message msg, long uptimemillis); //定時傳送訊息

sendmessagedelayed(message msg, long delaymillis); //延時傳送訊息

sendmessageatfrontofqueue(message msg); //最先處理訊息(慎用)

handler處理者,負責message的傳送及處理。使用handler時,需要實現handlemessage(message msg)方法來對特定的message進行處理,例如更新ui等。

messagequeue

訊息佇列,用來存放handler傳送過來的訊息,並按照fifo規則執行。當然,存放message並非實際意義的儲存,而是將message以鍊錶的方式串聯起來的,等待looper的抽取。

把訊息進行排序,排序的依據就是訊息要執行的時間

looper

訊息幫浦,不斷地從messagequeue中抽取message執行。通過looper去訊息佇列取訊息

當主線程建立的時候,就會建立乙個looper,looper在new的時候會建立乙個messagequeue 。所以,乙個執行緒對應乙個looper乙個looper對應乙個messagequeue

looper建立之後必須呼叫loop方法,loop方法中有乙個死迴圈,這個死迴圈會不斷去訊息佇列裡取訊息,取出訊息之後就會呼叫handler的handlemessage方法處理訊息

thread

執行緒,負責排程整個訊息迴圈,即訊息迴圈的執行場所。

3.使用handler的幾種方法

1.1主線程中定義handler,子執行緒中發訊息,通知handler完成ui更新

handler物件必須定義在主線程中,如果是多個類直接互相呼叫,就不是很方便,需要傳遞content物件或通過介面呼叫

在主線程中

主線程接收訊息處理操作

private handler myhandler = new handler() }};

//開啟乙個子執行緒,子執行緒傳送資訊

new thread(

new runnable() else

if(a==2)else

if(a==3)else

if(a==4)}}

).start();

2.1用activity物件的runonuithread方法更新

new thread()  

});

} }.start();

如果在非上下文類中(activity),可以通過傳遞上下文實現呼叫;

activity activity = (activity) imageview.getcontext();

activity.runonuithread(new runnable()

4.關於handler底層原始碼解讀

handler機制原理全面整理

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

handler通訊機制

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

Handler機制概要

簡而言之,每個thread裡面有looper 通過prepare初始化,通過loop進入死迴圈 每個handler將自己的msg放入looper死迴圈裡面,然後looper迴圈檢測訊息再傳送回給handler。記憶體洩漏問題 這裡需要注意乙個記憶體洩漏問題,就是當activity退出的時候會出現記憶...