Handler.sendMessage 与 Handler.obtainMessage.sendToTarget比较
原文地址:
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= "" > 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 的方法上,而是调用他们之前对象的创建问题上。
转载于:https://www.cnblogs.com/shenchanghui/p/5391178.html
Handler.sendMessage 与 Handler.obtainMessage.sendToTarget比较相关推荐
- Handler完全解读——Handler的使用
个人博客:https://blog.N0tExpectErr0r.cn 小专栏:https://xiaozhuanlan.com/N0tExpectErr0r Handler完全解读--Handler ...
- Handler sendMessage 与 obtainMessage (sendToTarget)比较
转自:http://iaiai.iteye.com/blog/1992196 obtainmessage()是从消息池中拿来一个msg 不需要另开辟空间new new需要重新申请,效率低,obtian ...
- sendMessage 与 obtainMessage (sendToTarget)比较
我们平时在做到多线程问题的时候可能利用Handler去传递Message,其中,经常使用的就是 1.new Handler().obtainMessage().sendToTarget(); 2.ne ...
- Android Handler sendMessage和 sendMessageDelayed的使用
sendMessage :立即发送消息 sendMessageDelayed:指定多少毫秒后发送消息. 其实常用的还有2个 sendEmptyMessage 发送空消息, 一般自己想把某种操作放到子 ...
- handler.post和handler.sendMessage的区别和联系
现在大部分人都很熟悉handler这个东西了,我们常用handler的场景无非有两个: 1. 异步更新UI 2. 延时任务 但是我一直有一个困惑,就是handler.post(r)这个方法有什么独特的 ...
- 安卓handler的用法,handler举例
原帖跳转: link 一.Handler的定义: Handler主要接收子线程发送的数据, 并用此数据配合主线程更新UI,用来跟UI主线程交互用.比如可以用handler发送一个message,然后在 ...
- 【Android 异步操作】手写 Handler ( Handler 发送与处理消息 | Handler 初始化 | 完整 Handler 代码 )
文章目录 一.Handler 发送与处理消息 ( 两大功能 ) 二.Handler 初始化 三.完整 Handler 代码 一.Handler 发送与处理消息 ( 两大功能 ) Handler 有两个 ...
- 【Android 异步操作】Handler ( 主线程中的 Handler 与 Looper | Handler 原理简介 )
文章目录 一.主线程中的 Handler 与 Looper 二.Handler 原理简介 一.主线程中的 Handler 与 Looper Android 系统中 , 点击图标启动一个应用进程 , 就 ...
- gen_event中的handler和supervised handler
呃,在gen_event中有两个添加handler的方法 gen_event:add_handler/3 gen_event:add_sup_handler/3 一开始总是有些迷惑两者的区别,今天查看 ...
- android handler内存,Android handler之内存泄露原因揭示
关于handler机制大家可以看前面专题Android面试精选--再聊android Handler机制.今天我们要说的重点是 handler为什么会发生内存泄露? 我们先从源头说起,应用刚启动时,第 ...
最新文章
- 主键需要键索引吗_MySQL 索引的知识点都在这里了,建议收藏!
- 为 raspberrypi 开发内核模块
- MySQL 全局锁和表锁
- 有效可靠地管理大规模 Kubernetes 集群
- Comet OJ - Contest #0
- python棋盘最短路径_【leetcode】64. Minimum Path Sum 棋盘最短路径
- 20个科学小知识,带你走进科学世界
- IDEA中配置Python环境并运行
- 大数据_Hbase-内容回顾和补充---Hbase工作笔记0018
- css 文字可选,在HTML5中如何使用CSS建立不可选的文字
- 素数的判断(c语言)
- 微信小程序登录界面 服务器,微信小程序之登录页-------实例
- UltraCompare官方网站
- 国人劝酒经典用语大全
- Coggle推荐系统学习任务1:推荐系统基础
- Excel 2010 VBA 入门 140 在功能区添加按钮并运行VBA程序
- python生成word文档_python实现的生成word文档功能示例
- python k线斜率计算公式_python – 计算Numpy(或Scipy)中的斜率
- css表格nth左对齐,使用CSS nth-child选择单个表格单元格
- SpringSecurity最新版本使用总结
热门文章
- NYOJ 2括号配对 栈的运用
- 浩鲸科技是外包公司吗_广东电商外包服务公司是什么意思_聚财猫科技
- 【HDU3336】Count the String(kmp--每个前缀出现的次数)
- 2019蓝桥:奇数倍数问题
- 计算机电路基础电压比较器电路图,计算机电路基础期末复习.doc
- 马尔科夫决策过程(MDP) : GridWord(DP)
- C/C++[codeup 1926]EXCEL排序
- 极客大学架构师训练营 性能优化 性能测试指标 性能测试 性能优化 CDN 网络 硬盘 缓存 异步 集群 第13课 听课总结
- CART树算法的剪枝算法
- pycharm控制台打印时显示内容,不用省略号代替