Handler 机制深入理解(Handler、Looper、MessageQueue)

本文详细介绍了Android中的Handler消息处理机制,包括Handler的用途、核心类Handler、Message、Looper和MessageQueue的角色及它们之间的关系。Handler主要用于线程间通信,特别是子线程更新UI。Looper不断从MessageQueue中取出Message并交给Handler处理。Handler的dispatchMessage方法处理消息,post和send本质都是将消息放入MessageQueue。同时,文章提到了ActivityThread中的Handler及其在主线程中的特殊角色。
摘要由CSDN通过智能技术生成

Handler

Handler 主要用于在不同的线程中相互通信,使用场景最多的应该就是在子线程中更新 UI。
与 Handler 相关的类:



Handler:处理与发送消息(Message)

Message:消息的包装类

Looper:整个 Handler 通信的核心,接受 Handler 发送的 Message,循环遍历 MessageQueue 中的 Message,并发送至 Handler 处理

MessageQueue:保存 Message

LocalThread:存储 Looper 与 Looper所在线程的信息



关系流程图:
关系流程图

上图简单概括为:Handler 将 Message post 或者 send 到 MessageQueue 中,Looper 不断循环从 MessageQueue 中取出 Message 交由 Handler 来处理。

Handler 消息处理

Handler 处理消息的方法为 dispatchMessage:

/**
 * Handle system messages here.
 */
public void dispatchMessage(Message msg) {
    if (msg.callback != null) {
        handleCallback(msg);
    } else {
        if (mCallback != null) {
            if (mCallback.handleMessage(msg)) {
                return;
            }
        }
        handleMessage(msg);
    }
}

①判断 Message.callback 是否为空,不为空则交给 callback 处理;

②判断 Handler.callback 是否为空,不为空则调用 mCallback.handleMessage(msg) 处理;

③如果前面都为空,则调用 Handler.handleMessage(msg) 方法处理。

所以我们可以通过重写 dispatchMessage方法来改变这种默认的消息分发顺序。

一般来说,我们都是按照如下的方式使用 Message

Message message = mHandler.obtainMessage();
message.what = 0;
message.obj = "123";
mHandler.sendMessage(message);

我们很少在 Message 中使用 callback,那么 这个 callback究竟又是什么?

Handler 消息发送

post 方式

刚刚说到,Handler 发送 Message 有两类方法:post 和 send 。其中最常用的就是 send 方法了,下面来看一个使用 post 的例子:

mHandler.post(new Runnable() {
    @Override
    public void run() {
        //do something
    }
});

打开 post(Runnable) 方法:

public final boolean post(Runnable r){
    return  sendMessageDelayed(getPostMessage(r), 0);
}

其中把 Runnable 参数通过 getPostMessage() 方法包装成了 Message 消息,然后继续使用 send 方式发送到 MessageQueue 中去。
那么继续打开 getPostMessage 方法:

private static Message getPostMessage(Runnable r) {
    Message m = Message.obtain();
    m.callba
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值