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 方法就會返回空,我們去...