亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android編程之消息機制實例分析

2020-04-11 11:17:36
字體:
來源:轉載
供稿:網友

本文實例講述了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!"于畫面上,
角色綜述(回顧):

(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 (v.getId()) {    case R.id.btn:      thread = new MyThread();      thread.start();      break;    }     }    private class MyHandler extends Handler{        public MyHandler(Looper looper){      super(looper);    }    @Override    public void handleMessage(Message msg) {//處理消息      text.setText(msg.obj.toString());    }     }  private class MyThread extends Thread{    @Override    public void run() {      Looper curLooper = Looper.myLooper();      Looper mainLooper = Looper.getMainLooper();      String msg ;      if(curLooper==null){       mHandler = new MyHandler(mainLooper);       msg = "curLooper is null";      }else{       mHandler = new MyHandler(curLooper);       msg = "This is curLooper";      }      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程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久免费a∨| 亚洲人成网站在线播| 亚洲国产天堂久久综合网| 日韩电影中文字幕一区| 亚洲精品456在线播放狼人| 日韩天堂在线视频| 国产免费亚洲高清| 日韩av综合中文字幕| 97欧美精品一区二区三区| 亚洲精品乱码久久久久久按摩观| 亚洲成av人影院在线观看| 欧美激情aaaa| 日本一区二区三区在线播放| 欧美激情中文网| 日韩在线观看成人| 黑丝美女久久久| 欧美风情在线观看| 日韩av手机在线看| 亚洲一区二区三区视频| 久久男人的天堂| 亚洲图片在区色| 激情久久av一区av二区av三区| 精品露脸国产偷人在视频| 国产丝袜视频一区| 亚洲天堂男人天堂女人天堂| 日韩欧美视频一区二区三区| 亚洲激情视频在线观看| 国产精品久久久久秋霞鲁丝| 亚洲在线www| 一区二区成人精品| 欧美一区二区三区精品电影| 91精品久久久久久久久不口人| 大荫蒂欧美视频另类xxxx| 欧美精品在线极品| 精品少妇一区二区30p| 国产ts一区二区| 国产精品情侣自拍| 国产精品久久久av| 国产日韩欧美综合| 中文字幕日韩av电影| 国产精品人成电影在线观看| 成人久久18免费网站图片| 日韩精品免费一线在线观看| 国内精品久久久久久影视8| 日韩欧美在线观看| 91亚洲精品视频| 亚洲自拍偷拍在线| 国产精品日韩在线观看| 国产成人精品在线| 国产精品夫妻激情| 亚洲第一精品夜夜躁人人躁| 欧美精品少妇videofree| 亚洲偷欧美偷国内偷| 上原亚衣av一区二区三区| 日韩午夜在线视频| 亚洲老板91色精品久久| 久久精品视频在线播放| 亚洲视频自拍偷拍| 欧美电影免费观看网站| 亚洲日韩中文字幕在线播放| 一区二区三区在线播放欧美| 精品亚洲男同gayvideo网站| 日韩美女免费观看| 午夜精品久久久久久久久久久久久| 欧美成人一区在线| 欧美专区在线观看| 久久久久久久一区二区| 国产精品一区二区三区久久久| 精品国产一区久久久| 97av在线影院| 另类少妇人与禽zozz0性伦| 另类天堂视频在线观看| 国产精品夫妻激情| 欧美在线一区二区三区四| 国产精品第三页| 国产精品一区av| 国产日韩欧美视频在线| 久久久久久久爱| 国产成人综合精品在线| 中文字幕精品网| 日韩小视频网址| 亚洲精品国产精品国自产在线| 日韩国产欧美精品在线| 911国产网站尤物在线观看| 亚洲精品www| 亚洲欧洲av一区二区| 久久精品成人一区二区三区| 久久久999精品视频| 国产精品老牛影院在线观看| 色妞在线综合亚洲欧美| 中文字幕日韩在线播放| 欧美乱妇高清无乱码| 色综合久综合久久综合久鬼88| 国产日韩欧美黄色| 国产精品第100页| 久久精品这里热有精品| 国产精品视频yy9099| 欧美性生交xxxxx久久久| 国产精品第8页| 亚洲色图在线观看| 日韩欧美在线看| 亚洲精品福利在线观看| 91精品视频在线免费观看| 国产精品va在线| 精品国偷自产在线视频99| 国产成人福利网站| 久久精品国产一区二区三区| 久久成人精品一区二区三区| 狠狠躁18三区二区一区| 成人av在线网址| 久久国产精品久久久久久久久久| 国产成人aa精品一区在线播放| 精品在线欧美视频| 国产日韩av在线播放| 亚洲国产又黄又爽女人高潮的| 亚洲网站在线观看| 国产性色av一区二区| 日本成人黄色片| 国产美女主播一区| 久久国产精品偷| 成人欧美一区二区三区在线湿哒哒| 亚洲美女福利视频网站| 一区二区亚洲欧洲国产日韩| 日韩在线观看免费全| 亚洲全黄一级网站| 欧美第一淫aaasss性| 欧美一级高清免费播放| 亚洲天堂av综合网| 国产欧美中文字幕| 国产网站欧美日韩免费精品在线观看| 欧美激情在线视频二区| 日韩精品中文字幕在线| 国产精品扒开腿爽爽爽视频| 久久综合色影院| 国产精品免费在线免费| 97精品国产91久久久久久| 久久久久亚洲精品成人网小说| 精品国偷自产在线视频| 成人免费在线网址| 亚洲日本aⅴ片在线观看香蕉| 亚洲xxxxx性| 国产香蕉一区二区三区在线视频| 国产精品美女视频网站| 亚洲黄色www网站| 性欧美暴力猛交69hd| 欧美成年人网站| 国产精品2018| 国产精品亚洲激情| 狠狠躁天天躁日日躁欧美| 欧美激情网站在线观看| 日韩大片在线观看视频| 91情侣偷在线精品国产| 欧美日韩国产在线看| 亚洲人成77777在线观看网| 精品久久久久久久久中文字幕| 日韩av在线精品| 日韩在线欧美在线国产在线| 国产精品r级在线| 亚洲欧美综合v| 一区二区欧美久久| 日本欧美黄网站| 亚洲国产日韩欧美在线动漫| 国产精品久久久久秋霞鲁丝| 日韩免费看的电影电视剧大全|