Handler sendMessage 与 obtainMessage (sendToTarget)比较
2014-04-18 18:00
405 查看
http://www.cnblogs.com/android007/archive/2012/05/10/2494766.html
记得当时这么写的:
这样写也没有绝得不好,反正当时项目的功能实现了。(性能上还可以)
后来没事的时候看了看handler 的其他的方法,就看到了obtainMessage()这个方法.很奇怪,不知道为何还要出来的方法
本来上面的那段code 就能实现handler 的功能了,为什么还要出现他,后来百度google 一把,大家说 什么性能上有差别之
类的。。。。。结果可想而知(大部分的文章都是你抄我的我抄你的,技术就是这样出来的。。鄙视这种抄写别人博客文章而
不著名转载出处的人)。于是我就去看源码能否看到一些好的描述。
看看这两段代码其实就是方法不一样 ,参数都一样。但是为何实现的效果一样还要分离出来这么多方法呢?
到源码去看个究竟吧!
先去看sendMessage()这个方法。。。。它调用的是Handler 中的sendMessage(Message msg)
源码 片段1 如下:
?
再看handler.obtainMessage()源码 片段2 如下:
?
上面这两段都是Handler 里面的方法,不过在片段1 我们可以看到Message是我们作为参数传过去的,片段2的则是我们
Message帮我们处理,它调用obtain(Handler h)方法,之后我们还要调用Message中sendToTarget()这个方法。
看一下Message.obtain(Hanlder h) 的源码 代码片段3如下:
?
再看 sendToTarget() 源码 代码片段4 如下:
?
这里的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 的方法上,而是调用他们之前对象的创建问题上。
注意:本文严谨 转载 !
绿色通道: 好文要顶
关注我
收藏该文与我联系
android007
关注 - 1
粉丝 - 6
+加关注
13
0
(请您对文章做出评价)
»
下一篇:重新复习数据结构-------ArrayList
posted @ 2012-05-10 17:43
android007 阅读(20885) 评论(9)
编辑
收藏
评论列表
#1楼
2013-02-27 16:09
ichk
不错学习了
支持(0)反对(0)
#2楼
2013-03-20 10:42
liujunhg
写的很好,谢谢
支持(0)反对(0)
#3楼
2013-03-25 11:10
zdd@vicky
楼主最后一句话好有误导性啊,不应该把obtainMessage和sendMessage拿来区分。应该是obtainMessage和new Message()的区别,它们的区别也就在于Message的创建方式不同。
支持(6)反对(0)
#4楼
2013-09-02 15:35
dingaling
长见识了
支持(0)反对(0)
#5楼
2013-09-07 16:42
wuxinliulei
转载了,但是一定会著名出处的。。。。。。。。。嘿嘿
支持(0)反对(0)
#6楼
2013-10-31 10:50
_Never_
注意:本文严谨 转载 !
支持(0)反对(0)
#7楼
2013-10-31 10:54
_Never_
注意:本文严谨 转载 !
装什么装?真是。。
支持(1)反对(0)
#8楼
2013-11-23 11:23
Ameryzhu
不错,学习了。
支持(0)反对(0) http://pic.cnitblog.com/face/u478062.png?id=10173856
#9楼28848862014/2/28
11:10:23 2014-02-28 11:10
Captain林
我收藏可以么?
Handler sendMessage 与 obtainMessage (sendToTarget)比较
话说在工作中第一次接触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 如下:
?
?
上面这两段都是Handler 里面的方法,不过在片段1 我们可以看到Message是我们作为参数传过去的,片段2的则是我们
Message帮我们处理,它调用obtain(Handler h)方法,之后我们还要调用Message中sendToTarget()这个方法。
看一下Message.obtain(Hanlder h) 的源码 代码片段3如下:
?
?
看到这里也许有的人很疑惑,这样转来转去,转了一圈怎么又回到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 的方法上,而是调用他们之前对象的创建问题上。
注意:本文严谨 转载 !
绿色通道: 好文要顶
关注我
收藏该文与我联系
android007
关注 - 1
粉丝 - 6
+加关注
13
0
(请您对文章做出评价)
»
下一篇:重新复习数据结构-------ArrayList
posted @ 2012-05-10 17:43
android007 阅读(20885) 评论(9)
编辑
收藏
评论列表
#1楼
2013-02-27 16:09
ichk
不错学习了
支持(0)反对(0)
#2楼
2013-03-20 10:42
liujunhg
写的很好,谢谢
支持(0)反对(0)
#3楼
2013-03-25 11:10
zdd@vicky
楼主最后一句话好有误导性啊,不应该把obtainMessage和sendMessage拿来区分。应该是obtainMessage和new Message()的区别,它们的区别也就在于Message的创建方式不同。
支持(6)反对(0)
#4楼
2013-09-02 15:35
dingaling
长见识了
支持(0)反对(0)
#5楼
2013-09-07 16:42
wuxinliulei
转载了,但是一定会著名出处的。。。。。。。。。嘿嘿
支持(0)反对(0)
#6楼
2013-10-31 10:50
_Never_
注意:本文严谨 转载 !
支持(0)反对(0)
#7楼
2013-10-31 10:54
_Never_
注意:本文严谨 转载 !
装什么装?真是。。
支持(1)反对(0)
#8楼
2013-11-23 11:23
Ameryzhu
不错,学习了。
支持(0)反对(0) http://pic.cnitblog.com/face/u478062.png?id=10173856
#9楼28848862014/2/28
11:10:23 2014-02-28 11:10
Captain林
我收藏可以么?
相关文章推荐
- Handler sendMessage 与 obtainMessage (sendToTarget)比较
- Handler sendMessage 与 obtainMessage (sendToTarget)比较
- Handler sendMessage 与 obtainMessage (sendToTarget)比较
- Handler sendMessage 与 obtainMessage (sendToTarget)比较
- Handler sendMessage 与 obtainMessage (sendToTarget)比较
- Handler sendMessage 与 obtainMessage (sendToTarget)比较
- Handler sendMessage 与 obtainMessage (sendToTarget)比较
- Handler sendMessage 与 obtainMessage (sendToTarget)比较
- Handler sendMessage 与 obtainMessage (sendToTarget)比较
- Handler sendMessage 与 obtainMessage (sendToTarget)比较
- Handler sendMessage 与 obtainMessage (sendToTarget)比较
- Handler sendMessage 与 obtainMessage (sendToTarget)比较
- Handler sendMessage 与 obtainMessage (sendToTarget)比较
- Handler sendMessage 与 obtainMessage (sendToTarget)比较
- Handler sendMessage 与 obtainMessage (sendToTarget)比较
- Android sendMessage 与 obtainMessage (sendToTarget)比较
- Handler sendMessage 与 obtainMessage (sendToTarget)
- Handler sendMessage 与 obtainMessage (sendToTarge 4000 t)比较
- Handler sendMessage 与 obtainMessage (sendToTarget)比较
- Handler sendMessage 与 obtainMessage (sendToTarget)比较