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. poj: 1003

    简单题 #include <iostream> #include <stdio.h> #include <string.h> #include <stack& ...

  2. 在Tomcat里使用配置连接池连接数据库

    一:首先在Tomcat下的conf/context.xml文件里的contenx标签里配置数据源: <Resource name="jdbc/zzz" auth=" ...

  3. paper 39 :Matlab绘制误差棒图(errorbar函数的使用)

    同很多非数学相关专业的朋友一样,我第一次碰到这个图时也是丈二和尚摸不着头脑.只知道这个工字型的图案,中间的点代表的是平均值,上下的两条横线代表的是方差值,除此之外,连这个图叫什么名字都不知道,只好硬着 ...

  4. Creating Directives that Communicate

    <my-tabs> <my-pane title="Hello"> <h4>Hello</h4> <p>Lorem ip ...

  5. po line received is canceled(恢复PO被取消的余量)

    1張PO已部分收貨,後來由于某種原因,將部分收貨的PO明行取消,現在要對已收料的這一部分進行退貨處理,要怎麼做才好呢? [@more@]DATA COLLECTED===============COL ...

  6. ETM and PTM

    ETM:embedded Trace Macrocell PTM:Program Flow Trace Macrocell ETM-A7 macrocell提供Cortex-A7 MPcore的ins ...

  7. JS判断checkbox至少选择一项

    function Check() { if(checkboxs("checkboxname") == false){ // checkboxname: checkbox的名字 al ...

  8. oracle增删改查

    =======================批量删除,只留前十条数据. delete from THIRD_PARTY_MERCHANT a where a.rowid in ( select ro ...

  9. 使用BusyBox制作根文件系统【转】

    本文转载自:http://www.cnblogs.com/lidabo/p/5300180.html 1.BusyBox简介 BusyBox 是很多标准 Linux 工具的一个单个可执行实现.Busy ...

  10. Class.forName("ClassName")与ClassName.class的区别

    引发问题的来源:最近在看比较深入的JVM相关的书,不得不感慨,JVM确实是比较深奥,很多地方难以理解不说,在网上还找不到什么资料,发现一个左思右想都想不明白的问题上网来搜索,结果基本上都是从书上cop ...