Android——线程通讯 Handler、Looper、Message;
线程通讯问题
(主要用到了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
下面是一个实例来实现主线程内发送消息到线程类内:
package com.example.xx;
import android.os.Bundle;
import android.os.Looper;
import android.os.Message;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
Private static final int MAKE = 0x1;
Private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
... //这里是简单的获取组件
final LooperThread looperThread = new LooperThread();
looperThread.start();
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String info=”这是内容";
Message msMessage = new Message();
msMessage.what=MAKE;
msMessage.obj =info;
looperThread.handler.sendMessage(msMessage);
}
});
}
}
下面是线程类,用来接收主线程内发送过来的消息
package com.example.xx;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
public class LooperThread extends Thread {
public static Handler handler;
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
Looper.prepare();
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
If( Msg.what == MAKE){
System.out.println("--" + msg.obj.toString());
}
}
};
Looper.loop();
}
}
Android——线程通讯 Handler、Looper、Message;的更多相关文章
- Android中的Handler,Looper,Message机制
Android的消息处理有三个核心类:Looper,Handler和Message.其实还有一个Message Queue(消息队列),但是MQ被封装到Looper里面了,我们不会直接与MQ打交道,因 ...
- Android 线程通讯类Handler
handler是线程通讯工具类.用于传递消息.它有两个队列: 1.消息队列 2.线程队列 消息队列使用sendMessage和HandleMessage的组合来发送和处理消息. 线程队列类似一段代码, ...
- Android——线程通讯类Handler(转)
原文地址:http://uule.iteye.com/blog/1705951 handler是线程通讯工具类.用于传递消息.它有两个队列:1.消息队列2.线程队列 消息队列使用sendMessage ...
- Android之消息机制Handler,Looper,Message解析
PS:由于感冒原因,本篇写的有点没有主干,大家凑合看吧.. 学习内容: 1.MessageQueue,Looper,MessageQueue的作用. 2.子线程向主线程中发送消息 3.主线程向子线程中 ...
- Android消息处理机制(Handler 与Message)---01
一.handler的使用场景为么会有handler?(部分内容图片摘自http://www.runoob.com/w3cnote/android-tutorial-handler-message.ht ...
- Android线程和handler
根据视频仿照着写了个demo: package com.wyl.wylthreadtest; import android.graphics.Color; import android.os.Bund ...
- Android Bundle、Handler和Message类介绍
Bundle是一个载体,可以存放基本数据类型.对象等内容,相当于一辆汽车,可以装载很多东西,然后运到需要的地方,例如: Bundle mBundle=new Bundle(); mBundle.put ...
- Android消息机制探索(Handler,Looper,Message,MessageQueue)
概览 Android消息机制是Android操作系统中比较重要的一块.具体使用方法在这里不再阐述,可以参考Android的官方开发文档. 消息机制的主要用途有两方面: 1.线程之间的通信.比如在子线程 ...
- android学习11——Handler,Looper,MessageQueue工作原理
Message是Handler接收和处理的消息对象. 每个线程只能拥有一个Looper.它的loop方法读取MessageQueue中的消息,读到消息之后就把消息交给发送该消息的Handler进行处理 ...
随机推荐
- 2.05-random-uesr-proxy
import urllib.request def proxy_user(): proxy_list = [ {"https":""}, # {"ht ...
- chrome-performance页面性能分析使用教程
运行时性能表现(runtime performance)指的是当你的页面在浏览器运行时的性能表现,而不是在下载页面的时候的表现.这篇指南将会告诉你怎么用Chrome DevTools Performa ...
- UVA11584-Partitioning by Palindromes(动态规划基础)
Problem UVA11584-Partitioning by Palindromes Accept: 1326 Submit: 7151Time Limit: 3000 mSec Problem ...
- day13----迭代器、生成器、枚举对象
一.迭代器: 定义: (从装有多个值的容器中一次取出一个值给外界) 器:迭代器是个容器,包含多个值 迭代:循环反馈,从容器中一次取出一个值 迭代器不同于索引取值,但是也可以从容器对象中从前往后逐个返回 ...
- vsftpd 有关vsftpd的3个注意事项。。sshd[pid]: fatal: chroot into directory without nodev and either noexec or nosuid
今天帮助已好友配置vsftpd,可能是长时间不用这个东西了,竟然这里个半天才把需求折腾完, 其实需求简单,就是使用系统账户登录,不可跳转目录,限制权限,只能上次不能下载. 懵逼一: 最开始配置sftp ...
- 通过随机数获得学生成绩,并把每个元素赋值为学生的分数成绩,通过增强for循环遍历结果。
package com.Summer_0419.cn; /** * @author Summer * 通过随机数获得学生成绩,并把每个元素赋值为学生的分数成绩 */ public class Test ...
- 深入理解 Getter和Setter 对对象的属性监听
阅读目录 一:理解普通对象在声明时添加 get.set 二:Object.prototype.__defineGetter__ 和 Object.prototype.__defineSetter__ ...
- Python脱产8期 Day07 2019/4/19
一 数据类型的相互转化 1.哪些类型可以转换为数字类型 2.数字转换为字符串 print(str(10)) 3.字符串与列表相互转换 1.字符串转化为列表:list(字符串) 2.列表转换为字符串:' ...
- 原生js 函数 callee属性
一.在es5中,函数中有arguments参数,该参数是一个包含函数传入的参数的类数组. <script> function myArrgu(x){ console.log(argumen ...
- Spark笔记-gz压缩存储到HDFS【转】
参考:http://blog.csdn.net/u010454030/article/details/69291663 mergedRDD.saveAsTextFile(outputPath, cla ...