1. 程式人生 > >Android的訊息機制,用Android執行緒間通訊的Message機制,Android中Handler的使用方法

Android的訊息機制,用Android執行緒間通訊的Message機制,Android中Handler的使用方法

轉自:http://www.cnblogs.com/-OYK/archive/2011/08/03/2126657.html


Android的訊息機制(一)

 

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

同線程不同元件之間的訊息傳遞:

public class Activity1 extends Activity implements OnClickListener{

       Button button null ;

       TextView text null ;

       @Override

       protected void onCreate(Bundle savedInstanceState) {

              super .onCreate(savedInstanceState);

              setContentView(R.layout. activity1 );        

              button = (Button)findViewById(R.id. btn );

              button .setOnClickListener( this );

              text = (TextView)findViewById(R.id. content );

       }

       public void onClick(View v) {

              switch (v.getId()) {

              case R.id. btn :

                     Looper looper = Looper.myLooper (); // 取得當前執行緒裡的looper

                     MyHandler mHandler = new MyHandler(looper); // 構造一個handler 使之可與looper 通訊

                     //buton 等元件可以由mHandler 將訊息傳給looper 後, 再放入messageQueue 中, 同時mHandler 也可以接受來自looper 訊息

                     mHandler.removeMessages(0);

                     String msgStr = " 主執行緒不同元件通訊: 訊息來自button" ;

                     Message m = mHandler.obtainMessage(1, 1, 1, msgStr); // 構造要傳遞的訊息

                     mHandler.sendMessage(m); // 傳送訊息: 系統會自動呼叫handleMessage 方法來處理訊息

                     break ;

                }            

       }     

       private class MyHandler extends Handler{             

              public MyHandler(Looper looper){

                     super (looper);

              }

              @Override

              public void handleMessage(Message msg) { // 處理訊息

                     text .setText(msg. obj .toString());

              }            

       }

}

 

說明:

此程式啟動時,當前執行緒( 即主執行緒, 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!" 於畫面上,

Android訊息處理機制(二)

角色綜述(回顧):

   (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 Activity2 extends Activity implements OnClickListener{

       Button button null ;

       TextView text null ;

       MyHandler mHandler null ;

       Thread thread ;

       @Override

       protected void onCreate(Bundle savedInstanceState) {

              super .onCreate(savedInstanceState);

              setContentView(R.layout. activity1 );        

              button = (Button)findViewById(R.id. btn );

              button .setOnClickListener( this );

              text = (TextView)findViewById(R.id. content );

       }

       public void onClick(View v) {

              switch 

相關推薦

Android訊息機制Android執行通訊Message機制AndroidHandler的使用方法

轉自:http://www.cnblogs.com/-OYK/archive/2011/08/03/2126657.html Android的訊息機制(一)   android 有一種叫訊息佇列的說法,這裡我們可以這樣理解:假如一個隧道就是一個訊息佇列,那麼裡

Android訊息機制原理仿寫Handler Looper原始碼跨執行通訊原理--之執行通訊原理(一)

前言:我們都知道Android的執行緒通訊是用Handler、Looper機制實現的,面試也經常問道,網上也有很多文章介紹原始碼但是可能很多小白只是機械是的記憶,回答不清楚原理究竟是怎麼回事。下邊我將一步一步仿寫一個Handler、Looper模擬Android的執行緒間通訊

Android 併發程式設計】執行通訊的三種基本方式android執行

1. 使用管道流Pipes “管道”是java.io包的一部分。它是Java的特性,而不是Android特有的。一條“管道”為兩個執行緒建立一個單向的通道。生產者負責寫資料,消費者負責讀取資料。 下面是一個使用管道流進行通訊的例子。 public class Pip

執行通訊訊息機制MessageHandler

Message是訊息機制的資訊載體,開發人員可以在Message物件中封裝資料,封裝資料的方式有: 1)setData(),在Message中封裝Bundle型別的資料,在接收方使用getData()獲取該Bundle物件。 2)arg1屬性,int型別,用於封裝int型別變數 3)ar

Android進階(十六)子執行呼叫Toast報Can't create handler inside thread that has not called Looper.prepare() 錯誤

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

android進階3step2:Android App通訊——Android執行通訊

Android進階:網路與資料儲存—步驟1:Android網路與通訊(第2小節:Handler) https://blog.csdn.net/qq_17846019/article/details/82906216 Android進階:網路與資料儲存—步驟1:Android網路與通訊(第3小

Android小知識-Java多執行相關(執行通訊)下篇

本平臺的文章更新會有延遲,大家可以關注微信公眾號-顧林海,如果大家想獲取最新教程,請關注微信公眾號,謝謝! 在一種場景中,比如main執行緒建立並啟動了子執行緒,子執行緒需要做耗時操作,如果main執行緒想等子執行緒執行完成之後再結束,由於main執行緒比子執行緒先執行完,因此main執行緒獲取不

Android執行通訊的幾種方式

1.runOnUiThread(Runnable)              在子執行緒中直接使用該方法,可以更新UI runOnUiThread(new Runnable(){//更新UI                     @Override           

Android基礎學習之程序執行通訊方式總結

        首先介紹一下程序和執行緒的基本概念及兩者之間的區別:   程序:是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位。   執行緒:是程序的一個實體,是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本

程序通訊機制(管道、訊號、共享記憶體/訊號量/訊息佇列)、執行通訊機制(互斥鎖、條件變數、posix匿名訊號量)

(1)系統中每個訊號量的資料結構(sem)struct sem {     int semval; /* 訊號量的當前值 */     unsigned short  semzcnt;  /* # waiting for zero */     unsigned short  semncnt;  /* # w

Android程序通訊執行通訊

程序間和執行緒間通訊 這個知識點算是高階知識點, 執行緒和程序 首先要區分執行緒和程序的區別: 執行緒是cup最小排程單元; 程序是一系列執行緒的集合。 其實區分程序和執行緒通訊有一個很好的方法:程式是否重新起了一個虛擬機器,因為不同程序會啟動不

Android 執行通訊的方式

1、通過單向資料管道傳遞資料 管道(使用PipedWriter/ 建立PipedReader)是java.io包的一部分。也就是說,它們是一般的Java功能,而不是Android特定的。管道為同一程序內的兩個執行緒提供了一種連線和建立單向資料通道的方法。

android執行通訊的四種實現方式

1,通過Handler機制. private void one() { handler=new Handler(){ @Override

Java多執行執行通訊--等待(wait)/通知(notify)機制等待/通知之交叉備份例項

1、什麼是等待/通知機制   等待/通知機制在生活中比比皆是,比如在就餐時就會出現,如圖所示。      廚師和服務員之間的互動要在“菜品傳遞臺”上,在這期間會有幾個問題:   1).廚師做完一道菜的時間不確定,所以廚師將菜品放到‘菜品傳遞言,上的時間也

Java併發程式設計(04):執行通訊等待/通知機制

本文原始碼:[GitHub·點這裡](https://github.com/cicadasmile/java-base-parent) || [GitEE·點這裡](https://gitee.com/cicadasmile/java-base-parent) # 一、概念簡介 ## 1、執行緒通訊

34-多執行--死鎖+執行通訊+等待喚醒機制+多生產者多消費者問題

一、死鎖 1、死鎖的常見情形之一:同步的巢狀 說明:同步的巢狀,至少得有兩個鎖,且第一個鎖中有第二個鎖,第二個鎖中有第一個鎖。eg:同步程式碼塊中有同步函式,同步函式中有同步程式碼塊。下面的例子,同步程式碼塊的鎖是obj,同步函式的鎖是this。t1執行緒先執行同步程式碼塊,獲取鎖obj,需

程序執行的同步機制

因為是轉載文章, 在此標明出處,如有冒犯請聯絡本人。 因為好的文章,以前只想收藏,但連線有時候會失效,所以現在碰到好的直接轉到自己這裡。 原文出處:http://www.cnblogs.com/memewry/archive/2012/08/22/2651696.html

python多執行————3、多執行通訊:共享變數queue

1、共享變數 #通過共享變數 import time import threading url_list = [] def get_detail_html(): global url_list while True: if len(url_list):

PipedInputStreamPipedOutputStream例項執行通訊

Java.io.PipedOutputStream and java.io.PipedInputStream has been introduced in JDK 1.0. PipedOutputStream and PipedInputStream both are con

執行通訊與協作方式之——wait-notify機制

大家好,上篇文章為大家介紹了執行緒間通訊和協作的一些基本方式,那這篇文章就來介紹一下經典的wait-notify機制吧。 什麼是wait-notify機制? 想象一下有兩個執行緒A、B,如果業務場景中需要這兩個執行緒交替執行任務(比如A執行完一次任務後換B執行,B執行