线程中是如何保证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到期