Handler消息机制主要涉及以下类:
- Handler
- Looper
- MessageQueue
- Message
Handler必须创建在有Looper的线程中,Looper.prepare()即在该线程创建Looper。
- Handler发送消息到MessageQueue,调用MessageQueue的enqueueMessage(),将消息按时间顺序插入到链表中。
- Looper调用loop()开启无限循环,内部调用MessageQueue的next()取消息。内部调用nativePollOnce,作用是设置一个定时的睡眠。根据nextPollTimeoutMillis来判断睡眠:
- nextPollTimeoutMillis = 0 :无需睡眠,直接返回。
- nextPollTimeoutMillis > 0 :睡眠超过nextPollTimeoutMillis,就返回。
- nextPollTimeoutMillis = -1 :一直睡眠,直到其他线程唤醒。
- 取出消息后,则根据msg.target对应的handler,调用dispatchMessage来处理消息。当Looper调用了quit或者quitSafely,会导致取出的消息为null,则退出looper循环。
参考:
https://www.jianshu.com/p/a7559af33986
https://www.jianshu.com/p/13c8a66d3b5c