线程通讯问题

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

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

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

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

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

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

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

Message机制原理示意图:

Activity、IntentReceiver   <------>  Handler<----->  Looper<----->  MessageQueue

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

  1. package com.example.xx;

  2. import android.os.Bundle;

  3. import android.os.Looper;

  4. import android.os.Message;

  5. import android.app.Activity;

  6. import android.view.View;

  7. import android.view.View.OnClickListener;

  8. import android.widget.Button;

  9. public class MainActivity extends Activity {

  10. Private static final int MAKE = 0x1;

  11. Private Button button;

  12. @Override

  13. protected void onCreate(Bundle savedInstanceState) {

  14. super.onCreate(savedInstanceState);

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

  16. final LooperThread looperThread = new LooperThread();

  17. looperThread.start();

  18. button.setOnClickListener(new OnClickListener() {

  19. @Override

  20. public void onClick(View v) {

  21. // TODO Auto-generated method stub

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

  23. Message msMessage = new Message();

  24. msMessage.what=MAKE;

  25. msMessage.obj =info;

  26. looperThread.handler.sendMessage(msMessage);

  27. }

  28. });

  29. }

  30. }

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

    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. public class LooperThread extends Thread {

    7. public static Handler handler;

    8. @Override

    9. public void run() {

    10. // TODO Auto-generated method stub

    11. super.run();

    12. Looper.prepare();

    13. handler = new Handler() {

    14. @Override

    15. public void handleMessage(Message msg) {

    16. // TODO Auto-generated method stub

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

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

    19. }

    20. }

    21. };

    22. Looper.loop();

    23. }

    24. }

Android——线程通讯 Handler、Looper、Message;的更多相关文章

  1. Android中的Handler,Looper,Message机制

    Android的消息处理有三个核心类:Looper,Handler和Message.其实还有一个Message Queue(消息队列),但是MQ被封装到Looper里面了,我们不会直接与MQ打交道,因 ...

  2. Android 线程通讯类Handler

    handler是线程通讯工具类.用于传递消息.它有两个队列: 1.消息队列 2.线程队列 消息队列使用sendMessage和HandleMessage的组合来发送和处理消息. 线程队列类似一段代码, ...

  3. Android——线程通讯类Handler(转)

    原文地址:http://uule.iteye.com/blog/1705951 handler是线程通讯工具类.用于传递消息.它有两个队列:1.消息队列2.线程队列 消息队列使用sendMessage ...

  4. Android之消息机制Handler,Looper,Message解析

    PS:由于感冒原因,本篇写的有点没有主干,大家凑合看吧.. 学习内容: 1.MessageQueue,Looper,MessageQueue的作用. 2.子线程向主线程中发送消息 3.主线程向子线程中 ...

  5. Android消息处理机制(Handler 与Message)---01

    一.handler的使用场景为么会有handler?(部分内容图片摘自http://www.runoob.com/w3cnote/android-tutorial-handler-message.ht ...

  6. Android线程和handler

    根据视频仿照着写了个demo: package com.wyl.wylthreadtest; import android.graphics.Color; import android.os.Bund ...

  7. Android Bundle、Handler和Message类介绍

    Bundle是一个载体,可以存放基本数据类型.对象等内容,相当于一辆汽车,可以装载很多东西,然后运到需要的地方,例如: Bundle mBundle=new Bundle(); mBundle.put ...

  8. Android消息机制探索(Handler,Looper,Message,MessageQueue)

    概览 Android消息机制是Android操作系统中比较重要的一块.具体使用方法在这里不再阐述,可以参考Android的官方开发文档. 消息机制的主要用途有两方面: 1.线程之间的通信.比如在子线程 ...

  9. android学习11——Handler,Looper,MessageQueue工作原理

    Message是Handler接收和处理的消息对象. 每个线程只能拥有一个Looper.它的loop方法读取MessageQueue中的消息,读到消息之后就把消息交给发送该消息的Handler进行处理 ...

随机推荐

  1. No such property: FOR_RUNTIME for class: org.gradle.api.attributes.Usage

    自从Android studio升级到3.1版本,谷歌又折腾出让你意想不到的错误.... 从github上下了个项目用来学习,却出现了如下错误: No such property: FOR_RUNTI ...

  2. pandas 选择列或者添加列生成新的DataFrame

    选择某些列 import pandas as pd # 从Excel中读取数据,生成DataFrame数据 # 导入Excel路径和sheet name df = pd.read_excel(exce ...

  3. [JXOI2018]游戏

    嘟嘟嘟 九条可怜竟然有这种良心题,似乎稍稍刷新了我对九条可怜的认识. 首先假设我们求出了所有必须要筛出来的数m,那么\(t(p)\)就只受最后一个数的位置影响. 所以我们枚举最后一个数的位置,然后用组 ...

  4. Linux systemctl命令笔记

    指令格式 systemctl [command] [unit] 常用指令 1.启动 $ systemctl start 2.停止 $ systemctl stop 3.重启 $ systemctl r ...

  5. ORA-19566: exceeded limit of 0 corrupt blocks for file E:\xxxx\<datafilename>.ORA.

    How to Format Corrupted Block Not Part of Any Segment (Doc ID 336133.1) To BottomTo Bottom In this D ...

  6. Windows解压安装mysql 5.7.24,并部署多个mysql服务

    mysql官网windows安装文档 https://dev.mysql.com/doc/refman/5.7/en/windows-installation.html 第一步,选择安装包   htt ...

  7. IDEA 编译 Jmeter 4.0 ( 二次开发_1 )

    IDEA 编译 Jmeter 下载 http://jmeter.apache.org/download_jmeter.cgi 下载源码后解压『Jmeter』,我这边下载的是最新的『apache-jme ...

  8. IDE安装Lombok插件提高开发效率

    Lombok官方api:https://projectlombok.org/features/index.html 使用lombok之后,省去了许多没必要的get,set,toString,equal ...

  9. 联合索引在B+树上的结构

    一级索引 二级联合索引 假设这是一个多列索引(col1, col2,col3),对于叶子节点,是这样的:  PS:该图改自<MySQL索引背后的数据结构及算法原理>一文的配图. 也就是说, ...

  10. F#.NET周报 2018第34周-Ionide下载量100万

    回顾一下过去一周F#和.NET最新相关信息   原文   新闻 Ionide 你在VS Code 上写F# 是离不开他的. ^^ 下载100万了 .NET Core 2.1.3发布,支持LTS版本(L ...