【Android自助餐】Handler消息机制完全解析(五)鸟瞰与总结

版权声明:博主原创文章,转载注明出处! https://blog.csdn.net/xmh19936688/article/details/51901433

Android自助餐Handler消息机制完全解析(五)鸟瞰与总结

Message

用于发送的消息本身。常用字段有whatobj等。这里没什么好说的,无非是一些消息内容及其getter、setter。要说有点营养的就是那些botain()方法了,具体内容可以看Message中obtain()与recycle()的来龙去脉来了解。

MessageQueue

用于管理Message,比如添加、读取、移除等。详细分析可以看MessageQueue的队列管理来了解。

Handler

主要有创建消息、发送消息、移除消息、处理消息。详细分析可以看Handler解析来了解。

Looper

loop()方法封装成对象,并将对象保存到线程的ThreadLocal中,主要是在loop()的死循环中从消息队列取消息并回调Handler处理。详细分析可以看Looper解析来了解。

总结

  1. 一个应用启动过程中会在主线程中调用ActivityThread.main(),从而调用Looper.prepareMainLooper()Looper.loop()。前者会创建消息队列并记录当前线程,随后将looper本身放到线程存储ThreadLocal中。后者则无限循环的从消息队列中获取消息并处理。
  2. 创建Handler时会从线程存储ThreadLocal中获取looper并记录,然后从looper中获取消息队列并记录。
  3. 调用handler的obtainMessage()时会将当前handler放到消息的target中记录下来。
  4. 调用handler的sendMessage()方法会将消息添加到从looper获取的消息队列中。
  5. 当looper的loop()方法从消息队列取到消息时,就调用message.target.dispatchMessage()来分发到message记录的handler中进行处理。
  6. 向消息队列放消息时,如果没有指定时间,则设置其when为当前时间,然后放到链表存储,如果线程阻塞则唤醒线程。
  7. 从消息队列取消息时,如果队列不为空且队头消息的when不晚与当前时间,则从链表中取出并返回该消息,否则线程阻塞。

猜你喜欢

转载自blog.csdn.net/xmh19936688/article/details/51901433