A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 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消息机制的基本单元,源码细节详细讲解,请见下回分解哈~


35 个回复

倒序浏览
键盘敲烂,月薪过万!
回复 举报 1 0
楼主说的不错,学习。。。说的好,一起加油
回复 举报
讲的很细致,让人很容易看懂.
回复 举报
纯干货,加油
回复 举报
赞赞赞赞赞赞赞
回复 举报
不错,谢谢楼主分享
回复 举报
谢谢分享!顶!
回复 举报
谢谢分享!顶一个!!
回复 举报
高大上,真乃大神也!!!
回复 举报
yangpengliao 来自手机 初级黑马 2016-7-24 14:41:23
11#
顶贴会有技术分吗
回复 举报
夜叶lx 来自手机 中级黑马 2016-7-24 21:34:23
12#
今天好颓废,玩了一天什么都没做。。。感觉对不起自己的人生,瞬间不好了。。。。。。
回复 举报
666666666666666666666666
回复 举报
可以深入一层了解,谢谢楼主
回复 举报
赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞
回复 举报
感谢楼主分享,学习。。。,一起加油
回复 举报
楼主说的不错,学到了
回复 举报
进来学习一下
回复 举报
宋小宝好帅好帅的是吗
回复 举报
早晚会用到哈,谢谢
回复 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马