一、角色描述

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 Looper。

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对象。

这样描述可能太抽像,下面举几个实际的例子来说明:

二、举例

1.同线程内不同组件间的消息传递

Looper类用来管理特定线程内对象之间的消息交换(Message Exchange)。你的应用程序可以产生许多个线程。而一个线程可以有许多个组件,这些组件之间常常需要互相交换讯息。如果有这种需要,您可以替线程构造一个Looper对象,来担任讯息交换的管理工作。Looper对象会建立一个MessageQueue数据结构来存放各对象传来的消息(包括UI事件或System事件等)。

每一个线程里可含有一个Looper对象以及一个MessageQueue数据结构。在你的应用程序里,可以定义Handler的子类别来接收Looper所送出的消息。同线程不同组件之间的消息传递:

        1     public         class     Activity1     extends     Activity     implements     OnClickListener{      2      Button button     =         null    ;      3      TextView text     =         null    ;      4      @Override      5          protected         void     onCreate(Bundle savedInstanceState) {      6          super    .onCreate(savedInstanceState);      7      setContentView(R.layout.activity1);      8      button     =     (Button)findViewById(R.id.btn);      9      button.setOnClickListener(    this    );     10      text     =     (TextView)findViewById(R.id.content);     11      }     12          public         void     onClick(View v) {     13          switch     (v.getId()) {     14          case     R.id.btn:     15      Looper looper     =     Looper.myLooper();    //    取得当前线程里的looper         16          MyHandler mHandler     =         new     MyHandler(looper);    //    构造一个handler使之可与looper通信     17          //    buton等组件可以由mHandler将消息传给looper后,再放入messageQueue中                         //同时mHandler也可以接受来自looper消息         18          mHandler.removeMessages(    0    );     19      String msgStr     =         "    主线程不同组件通信:消息来自button    "    ;     20      Message m     =     mHandler.obtainMessage(    1    ,     1    ,     1    , msgStr);    //    构造要传递的消息         21          mHandler.sendMessage(m);    //    发送消息:系统会自动调用handleMessage方法来处理消息         22              break    ;     23          24      }     25      }     26          private         class     MyHandler     extends     Handler{     27          public     MyHandler(Looper looper){     28          super    (looper);     29      }     30      @Override     31          public         void     handleMessage(Message msg) {    //    处理消息         32          text.setText(msg.obj.toString());     33      }     34      }     35     }   

说明:

此程序启动时,当前线程(即主线程, 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()函数来处理,于是输出msgStr于TextView.

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. 【多线程】七、阻塞队列
  3. Android消除Toast延迟显示
  4. Android中的 Thread + Handler 线程简单应用范例
  5. 关于android消息处理的个人理解
  6. Android(安卓)实战之UI线程和Worker线程交互
  7. android中的jstack,看看线程都在干嘛
  8. 【转】Android内存泄漏简介
  9. 让class只有一个实例的例子

随机推荐

  1. android gradle多渠道打包配置
  2. Android(安卓)实现断点续传
  3. Android启动界面实现
  4. Gradle 修改生成apk时的文件名
  5. 汇总各种Android(安卓)蓝牙各种UUID
  6. Android获取状态栏和标题栏的高度
  7. Fragment沉浸式
  8. android 重力传感器的使用
  9. Android(安卓)NDK 开发的栈错误调试
  10. Android访问WCF(下篇)-客户端开发