Android中Message的一辈子
初始化
|
|
Looper.prepare()源码:
|
|
Looper的构造方法:
|
|
初始化阶段主要做了四件事:
- 依赖ThreadLocal给当前线程创建Looper的独立对象;
- 在Looper构造方法中创建MessageQueue;
- 创建Handler对象;
- 启动循环获取消息。
创建消息
|
|
发送
|
|
最终调用MessageQueue.enqueueMessage(Message msg, long when)
。
所谓的发送消息,其实是干了3件事:
- 把消息的状态改为inUse;
- 重组MessageQueue中的mMessages链条,把新消息放在队首;
- 唤醒Looper所在线程,开始循环处理消息。
接收
Looper的looper
方法中循环调用MessageQueue的next
方法读取新的message,如果有新消息,就调用handler的dispatchMessage(msg)
,进而调用handleCallback()
或者调用handleMessage
方法。最后通过msg的msg.recycleUnchecked();
完成消息的回收复用。
而此时,如果没有消息,或者下一个消息是延迟消息且还没到时间,looper会回调所有的idleHandler,然后通过linux的epoll机制进入休眠,降低cpu负载,直到调用Looper对象的quitSafely()
,进一步调MessageQueue的quit()
方法,更改mQuitting
标记,使MessageQueue的next
方法返回null,跳出Lopper的loop
循环,释放了线程。
明天补一张生命周期时序图吧,今天先到这了