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 ...
随机推荐
- Servlet里写验证码
public class CodeServlet extends HttpServlet { /** * The doGet method of the servlet. <br> * * ...
- C#访问PostGreSQL数据库的方法 http://www.jb51.net/article/35643.htm
这次的项目中的一个环节要求我把PostGreSQL数据取出来,然后放到SqlServer里,再去处理分析. http://www.jb51.net/article/35643.htm - 我对Post ...
- AP模块的发票过账后关联对应的凭证编号。
--AP发票 SELECT GJH.NAME,GJH.LEDGER_ID,GJH.JE_CATEGORY, GJH.JE_SOURCE,XDL.SOURCE_DISTRIBUTION_TYPE, XT ...
- 夺命雷公狗—angularjs—18—angularjs的事件
对于一款前端框架,提起事件,很容易让人联想到DOM事件,比如说鼠标点击以及页面滚动等.但是我们这里说的angular中的事件和DOM事件并不是一个东西. 事件的发布 我们可以通过 $emit() 以及 ...
- [ubuntu] ubuntu13.04安装rabbitcvs管理svn
加入源 sudo add-apt-repository ppa:rabbitvcs/ppa 更新 sudo apt-get update 安装软件 sudo apt-get install rabbi ...
- zw版【转发·台湾nvp系列Delphi例程】HALCON CropPart
zw版[转发·台湾nvp系列Delphi例程]HALCON CropPart procedure TForm1.Button1Click(Sender: TObject);var ho_Egypt1 ...
- 【python】标准库的大致认识
正如那句 Python 社区中很有名的话所说的:“battery included”,Python 的一大好处在于它有一套很有用的标准库(standard library).标准库是随着 Python ...
- YZM的全排列
50073081 YZM的全排列 [试题描述] 一天,老师给可怜的YZM出了一道题:写出1~n的全排列.YZM写了一天也没写出来.请你帮帮快跪的YZM,输出1~n的全排列.注:这里n为9 [输入要求] ...
- Android相对布局实例
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools= ...
- Hadoop实战3:MapReduce编程-WordCount统计单词个数-eclipse-java-ubuntu环境
之前习惯用hadoop streaming环境编写python程序,下面总结编辑java的eclipse环境配置总结,及一个WordCount例子运行. 一 下载eclipse安装包及hadoop插件 ...