(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,所有线程共享。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |