Android——线程通讯 Handler、Looper、Message;

线程通讯问题

(主要用到了Handler类,Looper类和Message类以及MessageQueue

Android主线程如何向子线程中发送消息的问题。让我们来想想,这其中的过程,无非就是创建一个Handler对象,然后一个线程发消息,另一个接收消息嘛。下面是接下来需要涉及到的几个重要类。我们可以把它们想象成以下几个内容。 信息队列管家(Looper); 消息队列(MessageQueue); 消息(Message):可以多个; 信息工人(Handler):可以多个;

下面主要介绍下这几个类:

1.LooperLooper它就像一个消息队列(MessageQueue)的管家(Looper),一个消息队列只有一个信息管家,并且管理整个消息队列,而一个消息队列内可以容纳多个消息(Message),而信息处理者(Handler)也可以有多个,消息队列处理者派遣他们向消息队列中存储或取出消息后执行任务;是用来为一个线程开启一个消息队列,通常情况下,Android下新开启的线程没有开启消息队列的(除了主线程外),主线程系统会默认为其开启一个消息队列;looper是通过MessageQueue来存放消息队列的,一个线程只有一个looper对象。

2.Message 是定义一个Messge包含必要的描述和属性数据,并且此对象可以被发送给android.os.Handler处理。属性字段:arg1arg2whatobjreplyTo等;其中arg1arg2是用来存放整型数据的;what是用来保存消息标识的;objObject类型的任意对象;replyTo是消息管理器,会关联到一个handlerhandler就是处理其中的消息。通常对Message对象不是直接new出来的,只要调用handler中的obtainMessage方法来直接获得Message对象。

3.Handler,通过handlerlooper来实现交互,通过可以把handler看做是looper的一个接口,用来向指定的looper发送消息和处理消息。Handler主要有两个用途:首先是可以定时处理或者分发消息,其次是可以添加一个执行的行为在其它线程中执行,对于Handler中的方法,可以选择你关心的操作去覆盖它,处理具体的业务操作,常见的就是对消息的处理可以覆盖public void handleMessage(参数)方法,可以根据参数选择对此消息是否需要做出处理。

注意:默认情况下,handler会与线程内定义的Looper绑定在非主线程中定义Handler=new Hander()会报错,原因是非主线程中默认没有创建Looper对象,需要先调用Looper.prepare()启用Looper  还有就是写在Looper.loop()之后的代码不会被执行,这个函数内部应该是一个循环,当调用mHandler.getLooper().quit()后,looper才会中止,其后的代码才能得以运行。 

Message机制原理示意图:

ActivityIntentReceiver   <------>  Handler<----->  Looper<----->  MessageQueue    

 

下面是一个实例来实现主线程内发送消息到线程类内:

 

  1. package com.example.xx;  

  2.   

  3. import android.os.Bundle;  

  4. import android.os.Looper;  

  5. import android.os.Message;  

  6. import android.app.Activity;   

  7. import android.view.View;  

  8. import android.view.View.OnClickListener;  

  9. import android.widget.Button;    

  10. public class MainActivity extends Activity {  

  11.    Private static final int MAKE = 0x1;

  12.      Private Button button;

  13.     @Override  

  14.     protected void onCreate(Bundle savedInstanceState) {  

  15.         super.onCreate(savedInstanceState);  

  16.     ...  //这里是简单的获取组件

  17.         final LooperThread looperThread = new LooperThread();  

  18.         looperThread.start();  

  19.         button.setOnClickListener(new OnClickListener() {  

  20.   

  21.             @Override  

  22.             public void onClick(View v) {  

  23.                 // TODO Auto-generated method stub  

  24.                String info=”这是内容";

  25.                 Message msMessage = new Message();  

  26.                 msMessage.what=MAKE;  

  27.                msMessage.obj =info;

  28.                 looperThread.handler.sendMessage(msMessage);  

  29.             }  

  30.         });  

  31.     }  

  32. }  


    下面是线程类,用来接收主线程内发送过来的消息

    1. package com.example.xx; 

    2. import android.os.Handler;  

    3. import android.os.Looper;  

    4. import android.os.Message;  

    5. import android.util.Log;  

    6.   

    7. public class LooperThread extends Thread {  

    8.     public static Handler handler;  

    9.   

    10.     @Override  

    11.     public void run() {  

    12.         // TODO Auto-generated method stub  

    13.         super.run();  

    14.         Looper.prepare();  

    15.         handler = new Handler() {  

    16.   

    17.             @Override  

    18.             public void handleMessage(Message msg) {  

    19.                 // TODO Auto-generated method stub  

    20.                If( Msg.what == MAKE){

    21.                      System.out.println("--" + msg.obj.toString()); 

    22.                   }  

    23.             }  

    24.         };  

    25.         Looper.loop(); 

    26.     }  

    27. }  

       

转载于:https://www.cnblogs.com/llw1996/p/6743794.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值