android 訊息機制

2021-08-26 04:50:12 字數 3325 閱讀 8117

[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...