Handler消息机制 笔记


这是笔记,没有源码分析和详细过程,只有自己总结出来的重点,源码分析看参考资料,前辈写的很好。

  • 一个线程,一个Looper,一个MessageQueue,多个Handler
  • MessageQueue单链表结构
  • 使用ThreadLocal机制保证一个线程一个Looper:https://www.cnblogs.com/--here--gold--you--want/p/15730088.html
  • 记得在子线程中调用Looper.prepare创建Looper,调用Looper.loop()开始循环,调用Looper.quie()结束循环
  • Android主线程的Looper不用prepare,在ActivityThread就已经创建好了。
  • 因为Looper.loop()是在子线程中调用,所以Handler的处理逻辑也就在子线程中进行了。

MessageQueue的next方法中,没有消息时,会调用nativePollOnce方法,这是一个natice方法,会调用到linux那边的一些有关线程阻塞之类的,会休眠,不会卡死!!然后有消息进来,在enqueueMessage方法中会调用nativeWake唤醒。

参考资料:

Android开发艺术探索:https://www.kancloud.cn/alex_wsc/android_art/1828638

面试:https://www2.imgeek.org/article/825358871