首先从ThreadLocal
中获取一个Looper
,如果没有则向ThreadLocal
中添加一个new Looper
,同时新建一个MessageQueue
。
主线程的Looper在ActivityThread创建。
ThreadLocal
是Java提供的用于保存同一进程中不同线程数据的一种机制。每个线程中都保有一个ThreadLocalMap
的成员变量,ThreadLocalMap
内部采用WeakReference
数组保存,数组的key即为ThreadLocal
内部的Hash值。
循环调用MessageQueue.next
获取消息,该函数在MessageQueue
中没有消息的时候会阻塞,这里采用了epoll
的I/O多路复用机制。当获取到一个消息的时候会返回。
在loop中获取到消息后,会调用Message内部的Handler引用并分派事件。