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,所有线程共享。

以上环节都是在各种条件准备妥当的前提下,各个环节的初始化和细节请参考以前的文章。

  • 10
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值