http://blog.csdn.net/caesardadi/article/details/8473777

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

Handler的使用分为两部分:

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

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

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

  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

  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()。

参考

Android Handler Message总结的更多相关文章

  1. Android Handler Message总结一下

    当应用程序启动时,会开启一个主线程(也就是UI线程).由她来管理UI.监听用户点击.来响应用户并分发事件等.所以一般在主线程中不要运行比較耗时的操作,如联网下载数据等,否则出现ANR错误.所以就将这些 ...

  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. C语言 单引号 双引号问题

    C语言中的单引号和双引号含义迥异,用单引号引起的一个字符实际上代表一个整数,整数值对应于该字符在编译器采用的字符集中的序列值,因此,采用ASCII字符集的编译器而言,‘a’的含义与0141或97严格一 ...

  2. html5文件上传

    <!DOCTYPE html><html><head> <title>Html5 Ajax 上传文件</title></head> ...

  3. 夺命雷公狗ThinkPHP项目之----企业网站23之网站前台二级分类的跳转(URL跳转到列表页或产品页)

    我们现在开始做实现我们的二级菜单如何跳转到指定的列表页或者产品也呢?? 我们分享下数据库情况: 我们的数据库里提前给我们预留了一个cate_type的字段,那么我们可以让这个字段进行判断,从而遍历出指 ...

  4. 如何在真机上调试Android应用程序(图文详解)(zz)

    http://www.cnblogs.com/lanxuezaipiao/archive/2013/03/11/2953564.html   1.首先将手机设置为调试模式 方法:设置——应用程序——开 ...

  5. ThinkPHP讲解(八)——显示、修改、添加、删除

    一.显示数据 <h1>主页面</h1> <table width="100%" border="1" cellpadding=&q ...

  6. js获取单选框radio的值

    遇到一个js获取radio值的问题,原来根据frm.type.value取到的值在ie下是空值 解决办法:type为每个radio的值 var chkObjs=document.getElements ...

  7. sql server 2008 安装过程与创建建sql server登录用户

    1.sql server 下载安装包路径:http://pan.baidu.com/s/1qWuzddq 2.安装过程图解教程 ,参照网址:http://jingyan.baidu.com/album ...

  8. json校验

    直接百度:json在线解析  或  json.cnhttp://json.cn/ json格式校验的.这个更加简洁些.

  9. PHP用substr截取字符串出现中文乱码问题用mb_substr

    PHP用substr截取字符串出现中文乱码问题用mb_substr实例:mb_substr('截取中文乱码问题测试',0,5, 'utf-8'); 语法 : string substr (string ...

  10. Java相关内容解析

    java中的反射机制是什么,有什么作用啊?要点:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的以及动态调 ...