美文网首页
Android Handler分析

Android Handler分析

作者: yqianqiao | 来源:发表于2023-03-26 11:37 被阅读0次

安卓中的Handle是一个非常重要的类,它主要用于处理消息和线程之间的通信。在本篇博客中,我们将对安卓中的Handle源码进行分析,希望能够帮助读者更好地理解这个类的实现原理。

首先,我们来看一下Handle的构造函数:

public Handle() {
    this(null, false);
}

可以看到,Handle的构造函数并没有做太多的事情,只是简单地调用了另一个构造函数,并传入了两个参数:null和false。

接下来,我们来看一下另一个构造函数:

public Handle(Callback callback, boolean async) {
    mLooper = Looper.myLooper();
    if (mLooper == null) {
        throw new RuntimeException(
            "Can't create Handle inside thread that has not called Looper.prepare()");
    }
    mQueue = mLooper.mQueue;
    mCallback = callback;
    mAsynchronous = async;
}

可以看到,在这个构造函数中,Handle首先获取了当前线程的Looper对象,如果当前线程没有Looper对象,则会抛出一个RuntimeException异常。接着,Handle将这个Looper对象中的消息队列赋值给了Handle的mQueue变量。然后,Handle还保存了一个回调接口对象mCallback和一个标志位mAsynchronous。

接下来,我们来看一下Handle中最重要的方法之一,sendMessage()方法:

public final boolean sendMessage(Message msg) {
    return sendMessageDelayed(msg, 0);
}

public boolean sendMessageDelayed(Message msg, long delayMillis) {
    if (delayMillis < 0) {
        delayMillis = 0;
    }
    return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
}

public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
    MessageQueue queue = mQueue;
    if (queue == null) {
        RuntimeException e = new RuntimeException(
            this + " sendMessageAtTime() called with no mQueue");
        Log.w("Handle", e.getMessage(), e);
        return false;
    }
    return enqueueMessage(queue, msg, uptimeMillis);
}

可以看到,sendMessage()方法实际上是调用了sendMessageDelayed()方法,并将delayMillis参数设置为0。sendMessageDelayed()方法中,Handle会根据delayMillis参数计算出消息的到达时间,然后调用sendMessageAtTime()方法将消息加入消息队列中。最后,sendMessageAtTime()方法会调用enqueueMessage()方法将消息插入到消息队列中。

接下来,我们来看一下enqueueMessage()方法的实现:

boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
    msg.target = this;
    if (mAsynchronous) {
        msg.setAsynchronous(true);
    }
    return queue.enqueueMessage(msg, uptimeMillis);
}

可以看到,enqueueMessage()方法首先将消息的目标对象设置为当前的Handle对象,然后如果Handle被标记为异步处理,则将消息的异步处理标志位设置为true。最后,enqueueMessage()方法调用了MessageQueue的enqueueMessage()方法将消息插入到消息队列中。

最后,我们来看一下Handle中另一个重要的方法,handleMessage()方法:

public void handleMessage(Message msg) {
    if (mCallback != null) {
        if (mCallback.handleMessage(msg)) {
            return;
        }
    }
    handleMesssage(msg);
}

protected void handleMesssage(Message msg) {
}

可以看到,handleMessage()方法首先判断是否设置了回调接口mCallback,如果设置了,则调用回调接口的handleMessage()方法处理消息。如果回调接口处理了消息,则直接返回,否则调用Handle自己的handleMesssage()方法处理消息。

总结一下,安卓中的Handle类是用于实现线程之间通信的一种机制,它的实现依赖于Looper和MessageQueue。当一个线程需要向另一个线程发送消息时,它可以创建一个Handle对象,并将消息通过Handle对象发送到目标线程的消息队列中。当目标线程的Looper对象从消息队列中取出消息后,会将消息交给Handle对象处理。Handle对象会根据消息的类型和内容,调用自己的handleMessage()方法或回调接口的handleMessage()方法来处理消息。

相关文章

网友评论

      本文标题:Android Handler分析

      本文链接:https://www.haomeiwen.com/subject/ctmordtx.html