handler 机制源码解析

125 阅读1分钟

线程中是如何保证looper 的唯一性:ThreadLocal

Looper通过ThreadLocal实现线程隔离:

threadlocal为每一个prepare的线程创建一个threadlocalMap(threadlocal,looper),用于存储looper  (注意:threadlocalMap是存在于thread中的)

 Looper.prepare中,在sThreadLocal.set(looper)之前先通过sThreadLocal.get()判断当前线程的ThreadLocalMap中是否已经有looper了,如果已经有looper就会抛出异常,这保证了一个thread中只设置一次looper,也就是说一个thread中的looper设置后就不会变了.

Looper.prepare() 对线程的looper进行初始化:

handler 是如何分发消息的:

首先,looper.loop()中无限循环, 从MessageQueue中取,取到就交给handler的回调处理

如果message中没有到期的消息,则调用native方法阻塞,(pipe管道),直到有message到期

handler sendMessage /post 源码解析 - 掘金 (juejin.cn)