版权声明:博主原创文章,转载注明出处! https://blog.csdn.net/xmh19936688/article/details/51901433
Android自助餐Handler消息机制完全解析(五)鸟瞰与总结
Message
用于发送的消息本身。常用字段有what
、obj
等。这里没什么好说的,无非是一些消息内容及其getter、setter。要说有点营养的就是那些botain()
方法了,具体内容可以看Message中obtain()与recycle()的来龙去脉来了解。
MessageQueue
用于管理Message,比如添加、读取、移除等。详细分析可以看MessageQueue的队列管理来了解。
Handler
主要有创建消息、发送消息、移除消息、处理消息。详细分析可以看Handler解析来了解。
Looper
将loop()
方法封装成对象,并将对象保存到线程的ThreadLocal
中,主要是在loop()
的死循环中从消息队列取消息并回调Handler
处理。详细分析可以看Looper解析来了解。
总结
- 一个应用启动过程中会在主线程中调用
ActivityThread.main()
,从而调用Looper.prepareMainLooper()
和Looper.loop()
。前者会创建消息队列并记录当前线程,随后将looper本身放到线程存储ThreadLocal
中。后者则无限循环的从消息队列中获取消息并处理。 - 创建Handler时会从线程存储
ThreadLocal
中获取looper并记录,然后从looper中获取消息队列并记录。 - 调用handler的
obtainMessage()
时会将当前handler放到消息的target
中记录下来。 - 调用handler的
sendMessage()
方法会将消息添加到从looper获取的消息队列中。 - 当looper的
loop()
方法从消息队列取到消息时,就调用message.target.dispatchMessage()
来分发到message记录的handler中进行处理。 - 向消息队列放消息时,如果没有指定时间,则设置其
when
为当前时间,然后放到链表存储,如果线程阻塞则唤醒线程。 - 从消息队列取消息时,如果队列不为空且队头消息的
when
不晚与当前时间,则从链表中取出并返回该消息,否则线程阻塞。