当应用程序启动时,会开启一个主线程(也就是UI线程)。由她来管理UI。监听用户点击。来响应用户并分发事件等。所以一般在主线程中不要运行比較耗时的操作,如联网下载数据等,否则出现ANR错误。所以就将这些操作放在子线程中。可是因为AndroidUI线程是不安全的。所以仅仅能在主线程中更新UI。Handler就是用来 子线程和创建Handler的线程进行通信的。

Handler的使用分为两部分:

 一部分是创建Handler实例,重载handleMessage方法,来处理消息。

[java] view
plain
copy

  1. mProgressHandler = new Handler()
  2. {
  3. public void handleMessage(Message msg)
  4. {
  5. super.handleMessage(msg);
  6. }
  7. };

当然,也可继承自Handler,相同要实现handleMessage(Message msg)方法。

[java] view
plain
copy

  1. class MyHandler extends Handler {
  2. public MyHandler() {
  3. }
  4. // 子类必须重写此方法,接受数据
  5. @Override
  6. public void handleMessage(Message msg) {
  7. // TODO Auto-generated method stub
  8. Log.d("MyHandler", "handleMessage......");
  9. super.handleMessage(msg);
  10. }
  11. }

还有一部分是分发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

[java] view
plain
copy

  1. Message message = Message.obtain();
  2. message.arg1 = 1;
  3. message.arg2 = 2;
  4. message.obj = "Demo";
  5. message.what = 3;
  6. Bundle bundleData = new Bundle();
  7. bundleData.putString("Name", "Lucy");
  8. 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总结一下的更多相关文章

  1. Android Handler Message总结

    http://blog.csdn.net/caesardadi/article/details/8473777 当应用程序启动时,会开启一个主线程(也就是UI线程),由她来管理UI,监听用户点击,来响 ...

  2. android的消息处理机制——Looper,Handler,Message

    在开始讨论android的消息处理机制前,先来谈谈一些基本相关的术语. 通信的同步(Synchronous):指向客户端发送请求后,必须要在服务端有回应后客户端才继续发送其它的请求,所以这时所有请求将 ...

  3. android Handler.btionMessage()与Message.obtain()的区别

    类概述 定义一个包含任意类型的描述数据对象,此对象可以发送给Handler.对象包含两个额外的int字段和一个额外的对象字段,这样可以使得在很多情况下不用做分配工作. 尽管Message的构造器是公开 ...

  4. Android Handler机制(一)---Message源码分析

    Message: 定义: public final class Message implements Parcelable Message类是个final类,就是说不能被继承,同时Message类实现 ...

  5. Android Handler处理机制 ( 三 ) ——Handler,Message,Looper,MessageQueue

    在android中提供了一种异步回调机制Handler,使用它,我们可以在完成一个很长时间的任务后做出相应的通知 handler基本使用: 在主线程中,使用handler很简单,new一个Handle ...

  6. Android Handler处理机制 ( 二 ) ——Handler,Message,Looper,MessageQueue

    Android是消息驱动的,实现消息驱动有几个要素: 消息的表示:Message 消息队列:MessageQueue 消息循环,用于循环取出消息进行处理:Looper 消息处理,消息循环从消息队列中取 ...

  7. Android Handler处理机制 ( 一 )(图+源码分析)——Handler,Message,Looper,MessageQueue

    android的消息处理机制(图+源码分析)——Looper,Handler,Message 作为一个大三的预备程序员,我学习android的一大乐趣是可以通过源码学习 google大牛们的设计思想. ...

  8. Android Handler之Message传递参数

    最近发现Message,发送消息可以传递参数,这个思路很好,所以写了一个例子,点击屏幕,给Activity发送一个消息,传递两个参数,并把这个activity销毁掉! 程序打开界面: 点击屏幕,销毁a ...

  9. Android 之异步任务(AsyncTask,Handler,Message,looper)

    AsyncTask: 3个类型(Params,Progress和Result),4个步骤(onPreExecute(),doInBackground(Params…),onProgressUpdate ...

随机推荐

  1. Ext图表的精彩

    最近做了几个Ext的图表,觉得效果还不错,分享一下 1.Chart[饼图.折线图.柱状图.堆状图]: 2.Grid: 3.最大化:

  2. QT插件开发方式(没看懂)

    创建一个QT的库项目,删除自动生成的.h和.cpp文件,添加一个接口定义.h文件和一个接口实现类(一个.h一个.cpp).代码如下: 1.接口文件源码 #ifndef PLUGININTERFACE_ ...

  3. find . -iname "*.jpg"|xargs -i mv {} .;for i in `ls`; do mv -f $i `echo $i | sed 's/JPG/jpg/'`; done

    find . -iname "*.jpg"|xargs -i mv {} .;for i in `ls`; do mv -f $i `echo $i | sed 's/JPG/jp ...

  4. 关于ubuntu下qt编译显示Cannot connect creator comm socket /tmp/qt_temp.xxx/stub-socket的解决的方法

    今天在ubuntu下安装了qtcreator,准备測试一下能否用.果然一測试就出问题了,简单编写后F5编译在gnome-terminal中出现 Cannot connect creator comm ...

  5. DELPHI学习---类和对象(五篇)

    Classes and objects(类和对象) 类(或者类类型)定义了一个结构,它包括字段(也称为域).方法和属性:类的实例叫做对象:类的字段.方法和属性被称为它的部件(components)或成 ...

  6. 基于libevent, libuv和android Looper不断演进socket编程 - 走向架构师之路 - 博客频道 - CSDN.NET

    基于libevent, libuv和android Looper不断演进socket编程 - 走向架构师之路 - 博客频道 - CSDN.NET 基于libevent, libuv和android L ...

  7. Android 动态生成布局 (多层嵌套)

    Android 除了能够载入xml文件,显示布局外,也能够代码生成布局,并通过setContentView(View view)方法显示布局.单独的一层布局,如一个主布局加一个控件(如Button\i ...

  8. Hbase经常使用命令

    hbase shell命令的使用 再使用hbase 命令之前先检查一下hbase是否执行正常 hadoop@Master:/usr/hbase/bin$ jps 2640 HMaster 27170 ...

  9. SQL Server Database 维护计划创建一个完整的备份策略

     SQL Server维护计划Maintenance Plan这是一个非常有用的维护工具,能够完成大部分的数据库维护任务,通过这些功能包.您可以省略大量的编码时间. 介绍的不是非常多,特此补上一篇 ...

  10. oracle 之 内存—鞭辟近里(四)

    oracle 之 内存—鞭辟近里(四) 今天是2013-07-11日,首先我非常感谢我的哥们也是我的网友杨工,非常感谢他能在大数据库内帮我执行一下我所需要的信息.就是他说的网络真是一个互助友爱的平台. ...