Android Handler Message总结
http://blog.csdn.net/caesardadi/article/details/8473777
当应用程序启动时,会开启一个主线程(也就是UI线程),由她来管理UI,监听用户点击,来响应用户并分发事件等。所以一般在主线程中不要执行比较耗时的操作,如联网下载数据等,否则出现ANR错误。所以就将这些操作放在子线程中,但是由于AndroidUI线程是不安全的,所以只能在主线程中更新UI。Handler就是用来 子线程和创建Handler的线程进行通信的。
Handler的使用分为两部分:
一部分是创建Handler实例,重载handleMessage方法,来处理消息。
- mProgressHandler = new Handler()
- {
- public void handleMessage(Message msg)
- {
- super.handleMessage(msg);
- }
- };
当然,也可继承自Handler,同样要实现handleMessage(Message msg)方法。
- class MyHandler extends Handler {
- public MyHandler() {
- }
- // 子类必须重写此方法,接受数据
- @Override
- public void handleMessage(Message msg) {
- // TODO Auto-generated method stub
- Log.d("MyHandler", "handleMessage......");
- super.handleMessage(msg);
- }
- }
另一部分是分发Message 或者Runable对象到Handler所在的线程中,一般Handler在主线程中。
Handler中分发消息的一些方法
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int what)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
handler本身不仅可以发送消息,还可以用post的方式添加一个实现Runnable接口的匿名对象到消息队列中,在目标收到消息后就可以回调的方式在自己的线程中执行run的方法体。
Message
- Message message = Message.obtain();
- message.arg1 = 1;
- message.arg2 = 2;
- message.obj = "Demo";
- message.what = 3;
- Bundle bundleData = new Bundle();
- bundleData.putString("Name", "Lucy");
- message.setData(bundleData);
Message 可以传递的参数有:
1. arg1 arg2 整数类型,是setData的低成本替代品。传递简单类型
2. Object 类型 obj
3. what 用户自定义的消息代码,这样接受者可以了解这个消息的信息。每个handler各自包含自己的消息代码,所以不用担心自定义的消息跟其他handlers有冲突。
4.其他的可以通过Bundle进行传递
Message可以通过new Message构造来创建一个新的Message,但是这种方式很不好,不建议使用。最好使用Message.obtain()来获取Message实例,它创建了消息池来处理的。
公共构造器
public Message()
构造器(但是获取Message对象的最好方法是调用Message.obtain())。
如下这些通过Message.obtain方式获取Message实例,参数中传递了Handler,发送该消息时不再使用handler.sendMessage这种方式。使用message.sendToTarget();不过归根到底都是调用Handler.sendMessage进行发送消息。Message类中保存Handler实例。
public static Message obtain (Handler h, int what, int arg1, int arg2, Object obj)
与obtain()一样,但是设置了target, what, arg1, arg2和obj的值。
参数
h 设置的target值
what 设置的what值
arg1 设置的arg1值
arg2 设置的arg2值
obj 设置的obj值
返回值
从全局池中分配的一个Message对象。
public static Message obtain (Handler h, int what, Object obj)
与obtain()一样,但是设置了target, what和obj的值。
参数
h 设置的target值
what 设置的what值
obj 设置的obj值
返回值
从全局池中分配的一个Message对象。
public static Messageobtain (Handler h, int what)
与obtain()一样,但是设置了target和what的值。
参数
h target的值
what what的值
返回值
从全局池中分配的一个Message对象。
public static Message obtain (Handler h)
与obtain()一样,但是设置了target的值
参数
h 消息对象的target成员的值
返回值
从全局池中分配的一个Message对象。
public static Message obtain (Handler h, Runnable callback)
与obtain(Handler)一样,但是设置回调函数,在Message返回时调用。
参数
h 消息对象的target成员的值
callback 当消息处理时会调用的回调函数
返回值
从全局池中分配的一个Message对象。
public static Message obtain ()
从全局池中返回一个新的Message实例。在大多数情况下这样可以避免分配新的对象。
public static Message obtain (Handler h, int what, int arg1, int arg2)
与obtain()一样,但是设置了target, what, arg1和arg2的值
参数
h 设置的targe值
what 设置的what值
arg1 设置的arg1值
arg2 设置的arg2值
返回值
从全局池中分配的一个Message对象。
public static Message obtain (Message obj)
同obtain(),但是从一个已存在的消息中拷贝值(包括它的目标)。
参数
orig 要拷贝的源消息
返回值
从全局池中分配的一个Message对象。
public Bundle peekData ()
与getData()相似,但是并不延迟创建Bundle。如果Bundle对象不存在返回null。更多信息见getData()。
参考
Android Handler Message总结的更多相关文章
- Android Handler Message总结一下
当应用程序启动时,会开启一个主线程(也就是UI线程).由她来管理UI.监听用户点击.来响应用户并分发事件等.所以一般在主线程中不要运行比較耗时的操作,如联网下载数据等,否则出现ANR错误.所以就将这些 ...
- android的消息处理机制——Looper,Handler,Message
在开始讨论android的消息处理机制前,先来谈谈一些基本相关的术语. 通信的同步(Synchronous):指向客户端发送请求后,必须要在服务端有回应后客户端才继续发送其它的请求,所以这时所有请求将 ...
- android Handler.btionMessage()与Message.obtain()的区别
类概述 定义一个包含任意类型的描述数据对象,此对象可以发送给Handler.对象包含两个额外的int字段和一个额外的对象字段,这样可以使得在很多情况下不用做分配工作. 尽管Message的构造器是公开 ...
- Android Handler机制(一)---Message源码分析
Message: 定义: public final class Message implements Parcelable Message类是个final类,就是说不能被继承,同时Message类实现 ...
- Android Handler处理机制 ( 三 ) ——Handler,Message,Looper,MessageQueue
在android中提供了一种异步回调机制Handler,使用它,我们可以在完成一个很长时间的任务后做出相应的通知 handler基本使用: 在主线程中,使用handler很简单,new一个Handle ...
- Android Handler处理机制 ( 二 ) ——Handler,Message,Looper,MessageQueue
Android是消息驱动的,实现消息驱动有几个要素: 消息的表示:Message 消息队列:MessageQueue 消息循环,用于循环取出消息进行处理:Looper 消息处理,消息循环从消息队列中取 ...
- Android Handler处理机制 ( 一 )(图+源码分析)——Handler,Message,Looper,MessageQueue
android的消息处理机制(图+源码分析)——Looper,Handler,Message 作为一个大三的预备程序员,我学习android的一大乐趣是可以通过源码学习 google大牛们的设计思想. ...
- Android Handler之Message传递参数
最近发现Message,发送消息可以传递参数,这个思路很好,所以写了一个例子,点击屏幕,给Activity发送一个消息,传递两个参数,并把这个activity销毁掉! 程序打开界面: 点击屏幕,销毁a ...
- Android 之异步任务(AsyncTask,Handler,Message,looper)
AsyncTask: 3个类型(Params,Progress和Result),4个步骤(onPreExecute(),doInBackground(Params…),onProgressUpdate ...
随机推荐
- yii框架各种防止sql注入,xss攻击,csrf攻击
PHP中常用到的方法有: /* 防sql注入,xss攻击 (1)*/ function actionClean($str) { $str=trim($str); ...
- PHP内核探索:哈希碰撞攻击是什么?
最近哈希表碰撞攻击(Hashtable collisions as DOS attack)的话题不断被提起,各种语言纷纷中招.本文结合PHP内核源码,聊一聊这种攻击的原理及实现. 哈希表碰撞攻击的基本 ...
- JS中数组的操作
1.数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限, ...
- OpenStack 多台计算节点时的问题
Contents [hide] 1 前言 2 bug 3 解决方法 4 网络问题 前言 添加一台计算节点后无法创建虚拟机.在调度层就错误: bug https://review.openstack.o ...
- JNI 回调小记
javah在eclipse中设置参数:location(javah.exe的位置)working dir(${project_loc}/src) -classpath .;./classes -d $ ...
- Objective-C代码的文件扩展名与数据类型
Objective-C数据类型可以分为:基本数据类型.对象类型和id类型. 基本数据类型有:int.float.double和char类型. 对象类型就是类或协议所声明的指针类型,例如:SAutore ...
- java hashMap缓存简单实现
直接上代码,干货: import java.util.HashMap; import java.util.Map; /** * map缓存 * @author ming * * @param < ...
- c#使用word、excel、pdf ——转
一.C# Word操作引入Word COM组件菜单=>项目=>添加引用=>COM=>Microsoft Word 11.0 Object Libraryusing Word = ...
- DBLINK的session无法关闭,报异常!
------解决方法-------------------------------------------------------- --ALTER SESSION alter session clo ...
- DOS下如何同时显示时区日期和时间
DOS下如何同时显示时区日期和时间 Echo %Date:~0,4%-%Date:~5,2%-%Date:~8,2% %Time:~0,2%:%Time:~3,2% 不显示周几 Echo %Date: ...