Handler.obtainMessage()的认识和理解
转自: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()的认识和理解相关推荐
- handler 与message的一些理解
观点一: Android 对进程的重要性评级的时候,选取它最高的级别.另外,当被另外的一个进程依赖的时候,某个进程的级别可能会增高.一个为其他进程服务的进程永远不会比被服务的进程重要级低.因为服务进程 ...
- Android handler.obtainMessage()传字符串用法
1.使用Thread线程实现Runnable的方式 public class MainActivity extends Activity implements Runnable {private Te ...
- Handler基本使用(二)new Message 、 Handler.obtainMessage和Message.obtain
通常使用handler发送信息时,会使用下面两种方式 //方法1Message msg = new Message();msg.what = 1;msg.arg1 = 2;msg.arg2 = 3;m ...
- linux线程handler,Handler从源码角度理解
上一个文章讲解了Handler的基本使用,同时也有一些问题没有解决,本篇带你从源码的角度理解. 首先让我们来看看Handler的构造方法: image.png 我靠这么多的构造方法啊,我们上一篇只用了 ...
- 点击页面上的按钮后更新TextView的内容,谈谈你的理解?(阿里面试题 参照Alvin笔记 Handler源码解析)
阿里面试题: 点击页面上的按钮后更新TextView的内容,谈谈你的理解? 首先,这个一个线程间通信的问题,可以从Handler的角度进行解释,可以从五个角度分析这个问题: 1.需要在主线程更新UI, ...
- 深入理解异步消息处理机制Message,handler,MessageQueue,looper
本文转自: http://www.cyqdata.com/android/article-detail-36658 本篇深入理解Android消息队列原理篇,将为您讲述Android世界中的消息机制, ...
- Handler sendMessage 与 obtainMessage (sendToTarget)比较
转自:http://iaiai.iteye.com/blog/1992196 obtainmessage()是从消息池中拿来一个msg 不需要另开辟空间new new需要重新申请,效率低,obtian ...
- 一分钟理解handler机制
背景 小编昨晚跟同学聊了很久,了解到其面试中的困惑,每当被问handler机制时就不知道怎么去说,哪怕他知道handler的作用.在这里呢,小编就用案例的形式带你深入了解handler. 案例 异步加 ...
- 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 ...
最新文章
- linux 定时任务 crontab 报错 service command not found 解决方法
- Windows核心编程 第五章 作业(下)
- 申请邓白氏编码和公司开发者账号需要的东西
- mysql文献综述_文献综述随笔(二十)
- iOS之加密的三种方法
- Spring Boot Data JPA
- 【Java 强化】代码规范、JavaBean、lombok、内省(Introspector)、commons 项目、注解详解
- 阿里蚂蚁金服中间件6轮面试!实拍题目和6点血泪总结!
- 华为手机怎么安装Google
- mro python_Python-MRO
- 使用Natapp本地调试微信公众号H5
- 论文阅读笔记:GMC Graph-Based Multi-View Clustering
- 怎样打开t6系统服务器,t6客户端如何连接服务器
- ABOV单片机KEIL C51编译器程序仿真器OCD-II操作步骤详解
- 【读书笔记->统计学】03-01 各种“距”和“差”-极差(全距)、四分位距(数)、百分位数、箱线图概念简介
- 大环境之下软件测试行业趋势能否上升?
- 黑客用我们服务器挖矿了
- 金誉半导体:MOS管耗尽型和增强型是什么意思?
- 付呗聚合支付快速教程 分账篇③——多商户模式下分账提现全流程详解
- 专业的机器人资讯与太空中的ROS
热门文章
- unity3d 切换场景过度动画
- 怎样使盒子上下左右居中
- 21省人均GDP超过1万美元,北京以19.01万元继续稳居榜首
- CSR8670蓝牙模块,立体声高品质音频方案
- 牵手网红城市重庆 鲲鹏生态不止“打卡”这么简单
- http://f.dataguru.cn/forum.php?mod=viewthreadtid=44212fromuid=4771
- 周经理写给公司 的一封信
- 七(7)探花功能-MongoDB地理位置查询-附近的人
- tiktok垂直账号运营经验分享
- 使用Modulated Convolutions修改 StarGAN V2