[color=green]一、 角色描述
1.looper:乙個執行緒可以產生乙個looper物件,由它來管理此執行緒裡的message queue(訊息佇列)。
2.handler:你可以構造handler物件來與looper溝通,以便push新訊息到message queue裡;或者接收looper(從message queue取出)所送來的訊息。
3. message queue(訊息佇列):用來存放執行緒放入的訊息。
4.執行緒:ui thread通常就是main thread,而android啟動程式時會替它建立乙個message queue。
每乙個執行緒裡可含有乙個looper物件以及乙個messagequeue資料結構。在你的應用程式裡,可以定義handler的子類別來接收looper所送出的訊息。
在你的android程式裡,新誕生乙個執行緒,或執行 (thread)時,並不會自動建立其message loop。
android裡並沒有global的message queue資料結構,例如,不同apk裡的物件不能透過massage queue來交換訊息(message)。
例如:執行緒a的handler物件可以傳遞訊息給別的執行緒,讓別的執行緒b或c等能送訊息來給執行緒a(存於a的message queue裡)。
執行緒a的message queue裡的訊息,只有執行緒a所屬的物件可以處理。
使用looper.mylooper可以取得當前執行緒的looper物件。
使用mhandler = new eevnthandler(looper.mylooper());可用來構造當前執行緒的handler物件;其中,eevnthandler是自已實現的handler的子類別。
使用mhandler = new eevnthandler(looper.getmainlooper());可誕生用來處理main執行緒的handler物件;其中,eevnthandler是自已實現的handler的子類別。
這樣描述可能太抽像,下面舉幾個實際的例子來說明:
二、 舉例
1. 同執行緒內不同元件間的訊息傳遞
looper類用來管理特定執行緒內物件之間的訊息交換(message exchange)。你的應用程式可以產生許多個執行緒。而乙個執行緒可以有許多個元件,這些元件之間常常需要互相交換訊息。如果有這種需要,您可以替執行緒構造乙個looper物件,來擔任訊息交換的管理工作。looper物件會建立乙個messagequeue資料結構來存放各物件傳來的訊息(包括ui事件或system事件等)。如下圖:
每乙個執行緒裡可含有乙個looper物件以及乙個messagequeue資料結構。在你的應用程式裡,可以定義handler的子類別來接收looper所送出的訊息。
同執行緒不同元件之間的訊息傳遞:
public class activity1extends activityimplements onclicklistener
public void onclick(view v)
} private class myhandlerextends handler
@override
public void handlemessage(message msg) }}
說明:此程式啟動時,當前執行緒(即主線程, main thread)已誕生了乙個looper物件,並且有了乙個messagequeue資料結構。
looper = looper.mylooper ();
呼叫looper類別的靜態mylooper()函式,以取得目前執行緒裡的looper物件.
mhandler = new myhandler (looper);
構造乙個myhandler物件來與looper溝通。activity等物件可以藉由myhandler物件來將訊息傳給looper,然後放入messagequeue裡;myhandler物件也扮演listener的角色,可接收looper物件所送來的訊息。
message m = mhandler.obtainmessage(1, 1, 1, obj);
先構造乙個message物件,並將資料存入物件裡。
mhandler.sendmessage(m);
就透過mhandler物件而將訊息m傳給looper,然後放入messagequeue裡。
此時,looper物件看到messagequeue裡有訊息m,就將它廣播出去,mhandler物件接到此訊息時,會呼叫其handlemessage()函式來處理,於是輸出"this my message!"於畫面上,
角色綜述(回顧):
(1)ui thread通常就是main thread,而android啟動程式時會替它建立乙個messagequeue。
(2)當然需要乙個looper物件,來管理該messagequeue。
(3)我們可以構造handler物件來push新訊息到message queue裡;或者接收looper(從message queue取出)所送來的訊息。
(4)執行緒a的handler物件可以傳遞給別的執行緒,讓別的執行緒b或c等能送訊息來給執行緒a(存於a的message queue裡)。
(5)執行緒a的message queue裡的訊息,只有執行緒a所屬的物件可以處理。
子執行緒傳遞訊息給主線程
public class activity2extends activityimplements onclicklistener
public void onclick(view v)
} private class myhandlerextends handler
@override
public void handlemessage(message msg)
}private class mythreadextends threadelse
mhandler.removemessages(0);
message m =mhandler.obtainmessage(1, 1, 1, msg);
mhandler.sendmessage(m);} }
}說明:
android會自動替主線程建立message queue。在這個子執行緒裡並沒有建立message queue。所以,mylooper值為null,而mainlooper則指向主線程裡的looper。於是,執行到:
mhandler = new myhandler (mainlooper);
此mhandler屬於主線程。
mhandler.sendmessage(m);
就將m訊息存入到主線程的message queue裡。mainlooper看到message queue裡有訊息,就會作出處理,於是由主線程執行到mhandler的handlemessage()來處理訊息。
下一節將會寫乙個關於應多執行緒請求網路資料的例子。
[/color]
Android訊息機制
looper執行緒 主人 的 message queue 郵箱 唯一的管理人員 handler快遞小哥 跟管理人員looper溝通,送 push 新郵件 訊息 讓管理人員looper代簽扔進郵箱 message queue,也接收管理人員從郵箱拿出來的件。message queue 訊息佇列 主人的...
Android訊息機制
參考文章 答案在於 threadlocal。看 一下子就可以知道了 一開始就構造了乙個looper,我們看looper.mylooper 做了什麼。可以 看到就是呼叫了一下sthreadlocal.get 看一下sthreadlocal的定義 這裡說,如果不呼叫prepare 方法就會返回空,我們去...
Android訊息機制 一
一 角色描述 1.looper 乙個執行緒可以產生乙個looper物件,由它來管理此執行緒裡的message queue 訊息佇列 2.handler 你可以構造handler物件來與looper溝通,以便push新訊息到message queue裡 或者接收looper 從message queu...