黑马程序员技术交流社区

标题: Android消息机制的原理—闭环总结 [打印本页]

作者: Android_Robot    时间: 2016-7-22 11:30
标题: Android消息机制的原理—闭环总结
本帖最后由 Android_Robot 于 2016-10-27 14:29 编辑



Android消息机制的原理—闭环总结



       消息机制基本流程包括Handler、MessageQueue、Looper、Message、消息池等消息机制的基本单元,将消息机制的原理闭环,可以将消息机制概括7个步骤:创建,发送、排队、取出、派送、处理、回收,下面这个流程图可以很好的帮助理解消息机制的闭环流程。

(1)创建:Message.obtain()从消息池中获取一个空的Message,如果池子为空,则返回一个new Message(),然后组装要携带的信息。

  ( 2 )   发送:无论是Message的sendToTarget()还是Handler的post()和send()系列方法,最终调用的是MessageQueue的enqueueMessage(),目的是插入消息到队列中。

(3)排队:插入的消息按照时间顺序排队,排在队首的是最先处理的消息,排在队尾的是最后要处理的。

(4)获取:Loop循环每一次循环只要检查队首的消息,没有符合条件的Message则线程阻塞,有符合则从MessageQueue取出。

(5)派送: 发送和派送是同一个Handler(每个消息携带着发送的Hanlder引用)。

(6)处理:如果消息携带Runnable则调用其run()方法处理,如果Handler有CallBack则调用CallBack的handleMessage()处理;如果两个都没有,则使用Handler的handleMessage()来处理。

(7)回收:处理完毕的消息是要回收方便再次使用,在Looper的loop()中调用recycleUnCheck()——>recycle()将消息的内容清空回收,如果消息池没满,则放入消息池,如果消息池满了(系统6.0  int spoolSize=50),则丢掉这个消息。消息池是进程中所有线程共享的。

这个是如何互相联系的:

(a)MessageQueue和Looper:一对一关系,MessageQueue的创建后放置在Looper中。

(b)Looper和线程:一个线程只有一个,创建之后保存在ThreadLocal中,想要获取ThreadLocal.get()即可。

(c)Handler和Looper:Handler创建时候,从ThreadLocal中获取Looper,Handler变量指向这个Looper,Handler和Looper绑定。

(d)Message和Handler:Handler发送Message时候,Message的target属性指向这个Handler,也是这个Handler来分发处理这个Message

(e)消息池:only one,所有线程共享。


关于Handler、Looper、Message、MessageQueue消息机制的基本单元,源码细节详细讲解,请见下回分解哈~

其他精华资源推荐:
【强荐!】2016年最新Android学习路线图——按此路线图学习月薪过万{ 火速收入}
[持续更新]2016最新Android视频教程+源码+技巧/经验+软件+面试


作者: sanmaovszhe    时间: 2016-7-22 23:13
键盘敲烂,月薪过万!
作者: 夜叶lx    时间: 2016-7-23 00:27
楼主说的不错,学习。。。说的好,一起加油
作者: 龙大人    时间: 2016-7-23 22:47
讲的很细致,让人很容易看懂.
作者: IT小兵_FSr9i    时间: 2016-7-23 22:51
纯干货,加油
作者: haochengjian    时间: 2016-7-23 23:15
赞赞赞赞赞赞赞
作者: Frank_Ms1ZR    时间: 2016-7-23 23:32
不错,谢谢楼主分享
作者: LuoYadong    时间: 2016-7-24 00:11
谢谢分享!顶!
作者: Michalel_yan    时间: 2016-7-24 00:17
谢谢分享!顶一个!!
作者: blackhorse1    时间: 2016-7-24 01:41
高大上,真乃大神也!!!
作者: yangpengliao    时间: 2016-7-24 14:41
顶贴会有技术分吗
作者: 夜叶lx    时间: 2016-7-24 21:34
今天好颓废,玩了一天什么都没做。。。感觉对不起自己的人生,瞬间不好了。。。。。。
作者: 申落土    时间: 2016-7-25 00:04
666666666666666666666666
作者: peterqiu007    时间: 2016-7-26 01:10
可以深入一层了解,谢谢楼主
作者: 敲代码小蚂蚁    时间: 2016-7-26 09:56
赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞
作者: miqideliwu    时间: 2016-7-26 23:41
感谢楼主分享,学习。。。,一起加油
作者: 修身丶丶丶    时间: 2016-7-26 23:54
楼主说的不错,学到了
作者: 13182002757    时间: 2016-7-28 08:41
进来学习一下
作者: fzc123    时间: 2016-7-28 22:46
宋小宝好帅好帅的是吗
作者: miqideliwu    时间: 2016-7-29 00:27
早晚会用到哈,谢谢
作者: 646721826    时间: 2016-7-29 17:08
还没学到先看看再说
作者: heimaojyj    时间: 2016-7-30 00:08
666666666666666666666666666666666
作者: lizhao    时间: 2016-7-31 14:24
键盘敲烂月薪过万
作者: 修身丶丶丶    时间: 2016-8-1 11:01
每天保持好心情
作者: ustcerlzy    时间: 2016-8-4 09:09
先从消息池中获取,如果池为空再创建一个message对象。get了。
作者: 夜神月light    时间: 2016-8-4 19:56
学习学习一起加油
作者: 811487754    时间: 2016-8-5 09:58
感谢分享,谢谢
作者: flyliou    时间: 2016-8-6 20:19
讲的不错一起学习进步,come on,道路就在前方!!
作者: 正哥敲代码    时间: 2016-8-6 23:58
谢谢呀学到了
作者: zaoan    时间: 2016-8-7 14:03
总结的条理清晰哈
作者: zaoan    时间: 2016-8-7 14:08
总结的条例清楚哈
作者: lyg0374    时间: 2016-8-9 08:22
handler 韩豆乐
作者: 阿弥陀佛么么哒    时间: 2016-8-10 08:36
赞赞赞赞赞赞赞
作者: Android_Robot    时间: 2016-8-10 16:50

作者: 姜磊_gJzPh    时间: 2016-9-1 22:32
6666666666
作者: 黑马初学者    时间: 2016-10-28 22:25
火影还更新么




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2