转自:http://www.cnblogs.com/android007/archive/2012/05/10/2494766.html
话说在工作中第一次接触Android 的Handler 的时候,不知道怎么去关注性能。

记得当时这么写的:

Message msg = new Message()
msg.what = xxx;
msg.arg1  = xxx;
msg.arg2  = xxx;
handler.sendMessage(msg);

这样写也没有绝得不好,反正当时项目的功能实现了。(性能上还可以)

后来没事的时候看了看handler 的其他的方法,就看到了obtainMessage()这个方法.很奇怪,不知道为何还要出来的方法

本来上面的那段code 就能实现handler 的功能了,为什么还要出现他,后来百度google 一把,大家说 什么性能上有差别之

类的。。。。。结果可想而知(大部分的文章都是你抄我的我抄你的,技术就是这样出来的。。鄙视这种抄写别人博客文章而

不著名转载出处的人)。于是我就去看源码能否看到一些好的描述。

Message msg = handler.obtainMessage();
msg.what = xxx;
msg.arg1  = xxx;
msg.arg2  = xxx;
msg.obj    = xxx;.................... 

看看这两段代码其实就是方法不一样 ,参数都一样。但是为何实现的效果一样还要分离出来这么多方法呢?

到源码去看个究竟吧!

先去看sendMessage()这个方法。。。。它调用的是Handler 中的sendMessage(Message msg)

源码 片段1  如下:

?
/**
     * Pushes a message onto the end of the message queue after all pending messages
     * before the current time. It will be received in {@link #handleMessage},
     * in the thread attached to this handler.
     
     * @return Returns true if the message was successfully placed in to the
     *         message queue.  Returns false on failure, usually because the
     *         looper processing the message queue is exiting.
     */
    public final boolean sendMessage(Message msg)
    {
        return sendMessageDelayed(msg,0);
    }

 再看handler.obtainMessage()源码 片段2 如下:

?
/**
    * Returns a new {@link android.os.Message Message} from the global message pool. <br>   * More efficient than creating and allocating new instances. <br>    * The retrieved message has its handler set to this instance    <br>   * (Message.target == this).
    * If you don't want that facility, just call Message.obtain() instead.
    */
   
   public final Message obtainMessage()
   {
       return Message.obtain(this);
   }

  

上面这两段都是Handler 里面的方法,不过在片段1  我们可以看到Message是我们作为参数传过去的,片段2的则是我们

Message帮我们处理,它调用obtain(Handler h)方法,之后我们还要调用Message中sendToTarget()这个方法。

看一下Message.obtain(Hanlder h) 的源码  代码片段3如下:

?
/**
   * Same as {@link #obtain()}, but sets the value for the <em>target</em> member on the Message return   * ed.
   * @param h  Handler to assign to the returned Message object's <em>target</em> member.
   * @return A Message object from the global pool.
   */
  public static Message obtain(Handler h) {
      Message m = obtain();
      m.target = h;
      return m;
  }

  再看 sendToTarget() 源码     代码片段4 如下:

?
/**
   * Sends this Message to the Handler specified by {@link #getTarget}.
   * Throws a null pointer exception if this field has not been set.
   */
  public void sendToTarget() {
     <span style="background-color: #ff0000;"> target.sendMessage(this);</span>
  }

  这里的target就是handler,sendToTarget()又在调用handler的 sendMessage 方法了。。。

看到这里也许有的人很疑惑,这样转来转去,转了一圈怎么又回到Handler的 sendMessage方法了?那么性能比较一说

还有其他的证据么?(难道调用的方法多性能就低么?也许有这么一点原因,不过这里几乎可以不考虑这一点性能损耗的)

那么性能的比较证据应该从哪里找呢?

  其实细心的同学已经看到了,注意看源码的注释,

/**
* Returns a new {@link android.os.Message Message} from the global message pool. More efficient than
* creating and allocating new instances. The retrieved message has its handler set to this instance (Message.target == this).
* If you don't want that facility, just call Message.obtain() instead.
*/

这里我们的Message 已经不是 自己创建的了,而是从MessagePool 拿的,省去了创建对象申请内存的开销。。。。。

到这里大家应该都明白了。所以以后使用的时候尽量使用 Message msg = handler.obtainMessage();的形式创

建Message,不要自己New Message 至于message产生之后你使用obtainMessage 或者是 sendMessage 效率影响

并不大.同时我们也要注意以后谈论性能的时候要找准位置,譬如这里性能的问题不是在调用 obtainMessage 和 sen

dMessage 的方法上,而是调用他们之前对象的创建问题上。

Handler.obtainMessage()的认识和理解相关推荐

  1. handler 与message的一些理解

    观点一: Android 对进程的重要性评级的时候,选取它最高的级别.另外,当被另外的一个进程依赖的时候,某个进程的级别可能会增高.一个为其他进程服务的进程永远不会比被服务的进程重要级低.因为服务进程 ...

  2. Android handler.obtainMessage()传字符串用法

    1.使用Thread线程实现Runnable的方式 public class MainActivity extends Activity implements Runnable {private Te ...

  3. Handler基本使用(二)new Message 、 Handler.obtainMessage和Message.obtain

    通常使用handler发送信息时,会使用下面两种方式 //方法1Message msg = new Message();msg.what = 1;msg.arg1 = 2;msg.arg2 = 3;m ...

  4. linux线程handler,Handler从源码角度理解

    上一个文章讲解了Handler的基本使用,同时也有一些问题没有解决,本篇带你从源码的角度理解. 首先让我们来看看Handler的构造方法: image.png 我靠这么多的构造方法啊,我们上一篇只用了 ...

  5. 点击页面上的按钮后更新TextView的内容,谈谈你的理解?(阿里面试题 参照Alvin笔记 Handler源码解析)

    阿里面试题: 点击页面上的按钮后更新TextView的内容,谈谈你的理解? 首先,这个一个线程间通信的问题,可以从Handler的角度进行解释,可以从五个角度分析这个问题: 1.需要在主线程更新UI, ...

  6. 深入理解异步消息处理机制Message,handler,MessageQueue,looper

    本文转自: http://www.cyqdata.com/android/article-detail-36658 本篇深入理解Android消息队列原理篇,将为您讲述Android世界中的消息机制, ...

  7. Handler sendMessage 与 obtainMessage (sendToTarget)比较

    转自:http://iaiai.iteye.com/blog/1992196 obtainmessage()是从消息池中拿来一个msg 不需要另开辟空间new new需要重新申请,效率低,obtian ...

  8. 一分钟理解handler机制

    背景 小编昨晚跟同学聊了很久,了解到其面试中的困惑,每当被问handler机制时就不知道怎么去说,哪怕他知道handler的作用.在这里呢,小编就用案例的形式带你深入了解handler. 案例 异步加 ...

  9. Android Handler Message 里面的message.what, message.arg1,message.obj,obtainMessage, message.setData的使用

    Android Handler Message 里面的message.what, message.arg1,message.arg2,message.obj,obtainMessage, messag ...

最新文章

  1. linux 定时任务 crontab 报错 service command not found 解决方法
  2. Windows核心编程 第五章 作业(下)
  3. 申请邓白氏编码和公司开发者账号需要的东西
  4. mysql文献综述_文献综述随笔(二十)
  5. iOS之加密的三种方法
  6. Spring Boot Data JPA
  7. 【Java 强化】代码规范、JavaBean、lombok、内省(Introspector)、commons 项目、注解详解
  8. 阿里蚂蚁金服中间件6轮面试!实拍题目和6点血泪总结!
  9. 华为手机怎么安装Google
  10. mro python_Python-MRO
  11. 使用Natapp本地调试微信公众号H5
  12. 论文阅读笔记:GMC Graph-Based Multi-View Clustering
  13. 怎样打开t6系统服务器,t6客户端如何连接服务器
  14. ABOV单片机KEIL C51编译器程序仿真器OCD-II操作步骤详解
  15. 【读书笔记->统计学】03-01 各种“距”和“差”-极差(全距)、四分位距(数)、百分位数、箱线图概念简介
  16. 大环境之下软件测试行业趋势能否上升?
  17. 黑客用我们服务器挖矿了
  18. 金誉半导体:MOS管耗尽型和增强型是什么意思?
  19. 付呗聚合支付快速教程 分账篇③——多商户模式下分账提现全流程详解
  20. 专业的机器人资讯与太空中的ROS

热门文章

  1. unity3d 切换场景过度动画
  2. 怎样使盒子上下左右居中
  3. 21省人均GDP超过1万美元,北京以19.01万元继续稳居榜首
  4. CSR8670蓝牙模块,立体声高品质音频方案
  5. 牵手网红城市重庆 鲲鹏生态不止“打卡”这么简单
  6. http://f.dataguru.cn/forum.php?mod=viewthreadtid=44212fromuid=4771
  7. 周经理写给公司 的一封信
  8. 七(7)探花功能-MongoDB地理位置查询-附近的人
  9. tiktok垂直账号运营经验分享
  10. 使用Modulated Convolutions修改 StarGAN V2