Android Handler Message总结一下

简介:

当应用程序启动时,会开启一个主线程(也就是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.         // 子类必须重写此方法,接受数据  
  6.         @Override  
  7.         public void handleMessage(Message msg) {  
  8.             // TODO Auto-generated method stub  
  9.             Log.d("MyHandler""handleMessage......");  
  10.             super.handleMessage(msg);  
  11.   
  12.         }  
  13.     }  

               还有一部分是分发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, arg2obj的值。

         參数

                   h               设置的target

                   what        设置的what

                   arg1         设置的arg1

                   arg2         设置的arg2

                   obj            设置的obj

         返回值

                  从全局池中分配的一个Message对象。

 

public static Message  obtain (Handler h, int what, Object obj)

obtain()一样,可是设置了target, whatobj的值。

         參数

                   h               设置的target

                   what       设置的what

                   obj            设置的obj

         返回值

                  从全局池中分配的一个Message对象。

 

public static Messageobtain (Handler h, int what)

obtain()一样,可是设置了targetwhat的值。

         參数

                   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, arg1arg2的值

         參数

                   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对象。

假设能够,使用arg1arg2域发送一些整型值以降低消耗。

參考

         getData()

         peekData()

 

public void  setTarget (Handler target)

设置将接收此消息的Handler对象。


             




 PS:

        线程安全和线程不安全

        线程安全就是多线程訪问时,採用了加锁机系统。当一个线程访问一个数据类。保护,其他线程不能被访问,直到线程完成读,使用前其他线程。

没有数据不一致或数据污染。


        线程安全是不提供数据访问保护,可能有一个以上的线程已使改变的数据而获得的数据是脏数据





本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5036662.html,如需转载请自行联系原作者


相关文章
|
4月前
|
消息中间件 网络协议 Java
Android 开发中实现数据传递:广播和Handler
Android 开发中实现数据传递:广播和Handler
44 1
|
4月前
|
安全 Android开发 开发者
【Android开发小技巧】扔掉这坑人的 Handler
【Android开发小技巧】扔掉这坑人的 Handler
63 0
|
30天前
|
消息中间件 存储 Java
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
Android 消息处理机制估计都被写烂了,但是依然还是要写一下,因为Android应用程序是通过消息来驱动的,Android某种意义上也可以说成是一个以消息驱动的系统,UI、事件、生命周期都和消息处理机制息息相关,并且消息处理机制在整个Android知识体系中也是尤其重要,在太多的源码分析的文章讲得比较繁琐,很多人对整个消息处理机制依然是懵懵懂懂,这篇文章通过一些问答的模式结合Android主线程(UI线程)的工作原理来讲解,源码注释很全,还有结合流程图,如果你对Android 消息处理机制还不是很理解,我相信只要你静下心来耐心的看,肯定会有不少的收获的。
82 3
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
|
2月前
|
消息中间件 调度 Android开发
Android经典面试题之View的post方法和Handler的post方法有什么区别?
本文对比了Android开发中`View.post`与`Handler.post`的使用。`View.post`将任务加入视图关联的消息队列,在视图布局后执行,适合视图操作。`Handler.post`更通用,可调度至特定Handler的线程,不仅限于视图任务。选择方法取决于具体需求和上下文。
32 0
|
3月前
|
Android开发
38. 【Android教程】Handler 消息传递机制
38. 【Android教程】Handler 消息传递机制
33 2
|
4月前
|
消息中间件 安全 数据处理
Android之Handler、Message、MessageQueue、Looper详解2
Android之Handler、Message、MessageQueue、Looper详解
56 0
|
4月前
|
Java Android开发
Android之Handler、Message、MessageQueue、Looper详解1
Android之Handler、Message、MessageQueue、Looper详解
45 0
|
4月前
|
消息中间件 缓存 安全
android开发,使用kotlin学习消息机制Handler
android开发,使用kotlin学习消息机制Handler
177 0
|
XML 消息中间件 API
Android 中handler消息机制的理解
Android 中handler消息机制的理解
69 0
|
2天前
|
测试技术 Linux Android开发
探索安卓开发之旅:从初学者到专家
【8月更文挑战第29天】本文是一篇为初学者和有一定经验的开发者准备的安卓开发指南。我们将从基础概念开始,逐步深入到高级主题,如自定义视图、性能优化等。无论你是刚刚入门,还是希望提升自己的技能,这篇文章都将为你提供有价值的信息和建议。让我们一起踏上这段激动人心的旅程吧!