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下一页
您需要登录后才可以回帖 登录 | 加入黑马