Android 的Handler消息机制
Handler作用
Android 规定只有在主线程(UI线程)更新UI,否则会抛出异常,并且Android又建议不要在主线程做线程去做好事操作,否则可能会导致ANR。
所以Handler的主要作用是解决子线程无法更新UI的问题。
Handler构成
Handler主要是由MessageQueue
,Looper
构成。
MessageQueue:
1、MessageQueue(消息队列)是以队列的形式插入和删除,采用的是单链表的形式存储消息。
2、MessageQueue主要有两个操作:插入和读取(删除)消息。
①使用enqueueMessage去往MessageQueue中插入一条消息。
②使用next从MessageQueue中读取一条消息并在MessageQueue中删除该消息。
Looper:
1、Looper(负责循环)是以无限循环的形式查找消息,当所有的消息处理完应该终止消息循环,否则会一直处于等待状态。
2、Looper的创建:
①在子线程使用Handler时必须先手动创建一个Looper
,否则会抛异常。使用Looper.prepare方法创建。
②在主线程中ActivityThread已经默认使用prepareMainLooper方法为我们创建了,其内部也是使用了prepare方法创建的。
3、Looper的退出:
①quit会直接退出Looper
②quitSafely是处理完消息后才退出
4、Looper的循环
使用Looper.loop方法开启循环。
Handler工作原理:
Handler通过post或者send方法发送一条消息到MessageQueue并插入。Looper发现有新消息就会通过Handler的dispatchMessage处理这条消息。
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
检查Message的callback是否为空也就是Handler的post方法传的Runnable,不为空由handleCallback处理。
为空再去判断mCallback是否为空,不为空就调用mCallback.handleMessage,最后调用handleMessage处理消息。
同步GitHub
参考《Android 开发艺术探索》
上一篇: 简化数据结构的初始化