Android 執行緒訊息迴圈機制

2021-05-27 12:46:53 字數 1555 閱讀 5810

looper用於封裝了android執行緒中的訊息迴圈,預設情況下乙個執行緒是不存在訊息迴圈(message loop)的,需要呼叫looper.prepare()來給執行緒建立乙個訊息迴圈,呼叫looper.loop()來

使訊息迴圈起作用,從訊息佇列裡取訊息,處理訊息。

注:寫在looper.loop()之後的**不會被立即執行,當呼叫後mhandler.getlooper().quit()後,loop才會中止,其後的**才能得以執行。looper物件通過messagequeue來存放訊息和事件。乙個執行緒只能有乙個looper,對應乙個messagequeue。

以下是android api中的乙個典型的looper thread實現:

//handler不帶引數的預設建構函式:new handler(),實際上是通過

looper.mylooper()來獲取當前執行緒中的訊息迴圈,

//而預設情況下,執行緒是沒有訊息迴圈的,所以要呼叫

looper

.prepare

()來給執行緒建立訊息迴圈,然後再通過,looper.loop()來使訊息迴圈起作用。

class

looperthread

extends

thread

};looper

.loop

();}}

另,activity的mainui執行緒預設是有訊息佇列的。所以在activity中新建handler時,不需要先呼叫looper.prepare()。

handler用於跟執行緒繫結,來向執行緒的訊息迴圈裡面傳送訊息、接受訊息並處理訊息。

以下是不帶引數的handler構造器:

public handler()

}mlooper = looper.mylooper();

if (mlooper == null)

mqueue = mlooper.mqueue;

mcallback = null;

}通過以下函式來向執行緒傳送訊息或runnable:

1、post(runnable),postattime(runnable, long),postdelayed(runnable, long);

當執行緒接收到runnable物件後即立即或一定延遲呼叫。

2、sendemptymessage(int),sendmessage(message),sendmessageattime(message, long), andsendmessagedelayed(message, long)。

當執行緒接受到這些訊息後,根據你的handler重構的handlemessage(message)根據接收到的訊息來進行處理。

另,乙個activity主線程中可以有多個handler物件,但messagequeuelooper是只有乙個,對應的looper也是只有乙個。

Android訊息機制

looper執行緒 主人 的 message queue 郵箱 唯一的管理人員 handler快遞小哥 跟管理人員looper溝通,送 push 新郵件 訊息 讓管理人員looper代簽扔進郵箱 message queue,也接收管理人員從郵箱拿出來的件。message queue 訊息佇列 主人的...

android 訊息機制

color green 一 角色描述 1.looper 乙個執行緒可以產生乙個looper物件,由它來管理此執行緒裡的message queue 訊息佇列 2.handler 你可以構造handler物件來與looper溝通,以便push新訊息到message queue裡 或者接收looper 從...

Android訊息機制

參考文章 答案在於 threadlocal。看 一下子就可以知道了 一開始就構造了乙個looper,我們看looper.mylooper 做了什麼。可以 看到就是呼叫了一下sthreadlocal.get 看一下sthreadlocal的定義 這裡說,如果不呼叫prepare 方法就會返回空,我們去...