Android Handler Message总结一下
当应用程序启动时,会开启一个主线程(也就是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()。
參考
getData()
setData(Bundle)
public void recyle ()
向全局池中返回一个Message实例。一定不能在调用此函数后再使用Message——它会马上被释放。
public void sendToTarget ()
向Handler发送此消息。getTarget()方法能够获取此Handler。假设这个字段没有设置会抛出个空指针异常。
public void setData (Bundle data)
设置一个随意数据值的Bundle对象。
假设能够,使用arg1和arg2域发送一些整型值以降低消耗。
參考
getData()
peekData()
public void setTarget (Handler target)
设置将接收此消息的Handler对象。
PS:
线程安全和线程不安全
线程安全就是多线程訪问时,採用了加锁机系统。当一个线程访问一个数据类。保护,其他线程不能被访问,直到线程完成读,使用前其他线程。
没有数据不一致或数据污染。
线程安全是不提供数据访问保护,可能有一个以上的线程已使改变的数据而获得的数据是脏数据
Android Handler Message总结一下的更多相关文章
- Android Handler Message总结
http://blog.csdn.net/caesardadi/article/details/8473777 当应用程序启动时,会开启一个主线程(也就是UI线程),由她来管理UI,监听用户点击,来响 ...
- 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 ...
随机推荐
- Windows查看进程taskList,终止进程tskill
TaskList: 列出当前所有运行进程. 使用方法:在命令提示符中输入tasklist 然后回车,会看到类似下面的列表: 映像名称 ...
- 设置Mysql的连接超时参数
在Mysql的默认设置中,如果一个数据库连接超过8小时没有使用(闲置8小时,即 28800s),mysql server将主动断开这条连接,后续在该连接上进行的查询操作都将失败,将 出现:e ...
- IE与FF脚本兼容性问题
(1) window.event: 表示当前的事件对象,IE有这个对象,FF没有,FF通过给事件处理函数传递事件对象 (2) 获取事件源 IE用srcElement获取事件源,而FF用target获取 ...
- Python编程中常用的12种基础知识总结
原地址:http://blog.jobbole.com/48541/ Python编程中常用的12种基础知识总结:正则表达式替换,遍历目录方法,列表按列排序.去重,字典排序,字典.列表.字符串互转,时 ...
- freemarker自己定义标签(二)
freemarker自己定义标签 1.自己定义标签 通过自己定义标签,写一个反复指定字符串 2.实现源代码 <html> <head> <meta http-equiv= ...
- matlab矩阵的表示和简单操作
原地址:http://www.cnblogs.com/Ran_Ran/archive/2010/12/11/1903070.html 一.矩阵的表示在MATLAB中创建矩阵有以下规则: a.矩阵元素必 ...
- c++中volatile详解
1. 为什么用volatile? C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier.这是 BS 在 "The ...
- tomcat dbcp 基于jndi当配置java.sql.SQLException: Already closed
最近发现了一个现象,观察到的生产环境,不要有一段时间操作,然后另一个操作,首先将有一个数据库连接:java.sql.SQLException: Already closed.,例如下列: error ...
- JavaFX的扩展控件库ControlsFX介绍
声明: 本博客文章原创类别的均为个人原创,版权所有.转载请注明出处: http://blog.csdn.net/ml3947,另外本人的个人博客:http://www.wjfxgame.com. ...
- mac和windows系统下 eclipse svn 设置代理服务器
公司svn服务器在海外,有时候迫不得已svn也得设置代理 网上查了好长时间都只有windows下如何设置,mac系统下的教程很少. 1.在windows下设置方法如下 找到C:\Documentsan ...