欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android 的Handler消息机制

程序员文章站 2022-07-14 18:59:46
...

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 开发艺术探索》