Android的訊息機制

2021-09-30 09:30:15 字數 4792 閱讀 8083

android 有一種叫訊息佇列的說法,這裡我們可以這樣理解:假如乙個隧道就是乙個訊息佇列,那麼裡面的每一部汽車就是乙個乙個訊息,這裡我們先忽略掉超車等種種因素,只那麼先進隧道的車將會先出,這個機制跟我們android 的訊息機制是一樣的。

一、角色描述

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 所送出的訊息。

同執行緒不同元件之間的訊息傳遞:

publicclassactivity1extendsactivityimplementsonclicklistener

publicvoidonclick(view v)             

}     

privateclassmyhandlerextendshandler

@override

publicvoidhandlemessage(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 所屬的物件可以處理。

子執行緒傳遞訊息給主線程

publicclassactivity2extendsactivityimplementsonclicklistener

publicvoidonclick(view v)             

}     

privateclassmyhandlerextendshandler

@override

publicvoidhandlemessage(message msg)             

}privateclassmythreadextendsthreadelse

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() 來處理訊息。

本文主要介紹android的handler的使用方法。handler可以傳送messsage和runnable物件到與其相關聯的執行緒的訊息佇列。每個handler物件與建立它的執行緒相關聯,並且每個handler物件只能與乙個執行緒相關聯。

1.    handler一般有兩種用途:1)執行計畫任務,你可以再預定的實現執行某些任務,可以模擬定時器。2)執行緒間通訊。在android的應用啟動時,會建立乙個主線程,主線程會建立乙個訊息佇列來處理各種訊息。當你建立子執行緒時,你可以再你的子執行緒中拿到父執行緒中建立的handler物件,就可以通過該物件向父執行緒的訊息佇列傳送訊息了。由於android要求在ui執行緒中更新介面,因此,可以通過該方法在其它執行緒中更新介面。

◆ 通過runnable在子執行緒中更新介面的例子

private void updateuibyrunnable() 

}.start();

◆ 用message在子執行緒中來更新介面

1.    用message更新介面與runnable更新介面類似,只是需要修改幾個地方。

○ 實現自己的handler,對訊息進行處理

private class myhandler extends handler }

}○ 在新的執行緒中傳送訊息    

private void updatebymessage()

}.start();

} 比較詳細介紹了handler機制,大家可以參考.

Android的訊息機制

android的訊息機制主要是指handler的執行機制,而handler的執行離不開messagequeue和looper的支撐。其中messagequeue稱為訊息佇列,用作儲存一組訊息,並以佇列的形式對外提供插入和刪除工作 具體實現 使用單鏈表的結構來儲存訊息列表 messagequeue不能...

Android 的訊息機制

handler是android的訊息機制的上層介面,這使得在開發過程中只需要和handler互動即可,通過它可以很輕鬆地將乙個任務切換到handler所在的執行緒中去執行。android的訊息機制主要是指handler的執行機制,handler的執行需要底層的messageqeue和looper的支...

Android訊息機制

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