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. 08---Net基础加强

    资料管理器作业 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void F ...

  2. u盘安装centos

    1. 下载centos系统2. 使用UltraISO制作u盘启动.制作方法:http://jingyan.baidu.com/article/a378c960630e61b329283045.html ...

  3. 13.熟悉JDK的配置,环境变量

    已经做烂的东西,公司的新人环境配置手册文档Java方面的就是我写的,有意的留邮箱,很详细

  4. Concurrent Assertion

    Concurrent assertion中要求必须有clock,从而保证在每个clock edge都进行触发判断. assertion与design进行同步执行,concurrent assert只能 ...

  5. [转载]Emmet使用手册

    转载地址:  http://www.w3cplus.com/tools/emmet-cheat-sheet.html 介绍 Emmet (前身为 Zen Coding) 是一个能大幅度提高前端开发效率 ...

  6. 安装Debian的正确方法

    一.说明: Debian7.0.0的安装镜像文件有3个DVD,安装基本系统只用到第一个镜像文件,即DVD1 其它镜像文件是附带的软件包. 附Debian 7.0.0系统镜像下载地址: 32位:http ...

  7. JavaScript 闭包整合

    初遇闭包感觉很困惑,上网查看了些许介绍,有很多没看懂,就想先对能懂的东西整整 首先觉得要了解闭包,要先对一.JavaScript的变量作用域和作用域链有基本了解 1.变量的作用域分为:全局变量和局部变 ...

  8. android 项目学习随笔十三(ListView实现ITEM点击事件,将已读状态持久化到本地)

    1.因为给LISTVIEW增加了两个头布局,所以在点击事件ITEM索引会增加2,比如原来第一条数据的索引应该为0,增加两个头布局后,它的索引变为        2,为了使LISTVIEW的ITEM在点 ...

  9. android 学习随笔九(网络:简单新闻客户端实现)

    1.简单新闻客户端 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xm ...

  10. CentOS修改主机名和网络信息

    1.修改主机名称 [root@centos ~]# vim /etc/sysconfig/network打开文件,修改以下内容并保存 NETWORKING=yes #使用网络 HOSTNAME=cen ...