第十章,Android中的消息机制
消息机制概述
消息机制分析
主线程的消息循环
之前的总结 关于Android中的Handler 机制
消息机制概述
Android
消息机制的上层接口就是Handler
.Handler
需要MessageQueue,Looper
做支撑.Handler
创建的时候会采用当前线程的Looper
,涉及到ThreadLocal
Handler
的作用是将一个任务切换到指定的线程执行ViewRootImpl#checkThread
会对ui操作进行验证.- 为甚不能再子线程访问ui(Android
ui单线程模型
,防止ui访问逻辑复杂和效率低下
)
消息机制分析
ThreadLocal
是一个线程内部的数据存储类
MessageQueue
包含插入
和读取
操作,插入本身会伴随着删除操作
插入
和读取
分别对应着enqueueMessage
和next
方法MessageQueue
并不是队列
数据结构,而是一个单链表
Looper
扮演着消息循环的角色,不停地查看MessageQueue
中是否有新消息Looper.prepare
即可为当前线程创建Looper
,通过Looper.loop
即可开启循环prepareMainLooper
是为主线程ActivityThread
创建Looper
的- Looper提供了
quit(立即退出) 和 quitSafely(消息执行完安全退出)
来退出一个Looper
Looper
退出后,sendMessage
返回false,发送消息失败.- 在子线程中创建的
Looper
,建议不需要时手动退出
Looper#quit
调用后MessageQueue#next
返回null,跳出循环.
Handler工作原理
Handler
发送一条消息,则MessageQueue
的next
就会返回这条消息的Looper
,Looper
接到消息后就会调用Handler#dispatchMessage
来处理消息了.
Handler处理消息的过程:
- 检查
message.callback
是否为null,不为null,则handleCallback
- 检查
mCallBack
是否为null,不为 null,则调用mCallBack.handleMessage
- 当
mCallBack.handleMessage
返回false
或者没有没有mCallBack
,调用Handler#handleMessage
通过
CallBack
创建Handler
可以创建一个Handler
实例,而不用派生Handler
的子类
主线程的消息循环
Android
中的主线程就是ActivityThread
,入口是main
,其会调用Looper.prepareMainLooper
来创建主线程的Looper
及MessageQueue
,并通过Looper.loop
来开启消息循环.- 主线程消息循环开启后,
ActivityThread
还会开启一个ActivityThread.H
的Handler
来和消息队列
进行交互.ActivityThread.H
内部还定义了四大组件启动和停止相关消息.