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