从源码与官方文档看之Handler篇(二)

132 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第24天,点击查看活动详情 >> 希望大家可以帮忙点个赞,谢谢!

前言

今天又发现自己原来是Handler这个类名打错了导致前面几篇一直再说Java的Handle,而安卓的是Handler,前一篇文章我们主要翻译了安卓官方对Handler的注释,这一篇我们来看看Handler类的一些属性,成员变量。

正篇

首先我们看看Handler类的代码:

/*
 * Set this flag to true to detect anonymous, local or member classes
 * that extend this Handler class and that are not static. These kind
 * of classes can potentially create leaks.
 */
private static final boolean FIND_POTENTIAL_LEAKS = false;
private static final String TAG = "Handler";
private static Handler MAIN_THREAD_HANDLER = null;

我们可以看到,一开始给了一个bool标签,注释解释道如果此标记为真会检测这些不是静态的匿名、本地或成员类,而这些类会扩展本Handler类。 这些类别的类可能会造成泄漏。 然后第二个是Handler类的TAG标签,而第三个则是一个名为主线程Handler的静态的Handler对象且默认值为null。 接着往下看:

/**
 * Callback interface you can use when instantiating a Handler to avoid
 * having to implement your own subclass of Handler.
 */
public interface Callback {
    /**
     * @param msg A {@link android.os.Message Message} object
     * @return True if no further handling is desired
     */
    boolean handleMessage(@NonNull Message msg);
}

这是一个Callback回调,官方注释说明了可以在实例化 Handler 时使用的回调接口,以避免必须实现自己的 Handler 子类。其中,handleMesssage(Message msg)方法的msg是一个Message对象,方法的返回结果是当不需要进一步处理就返回为真。 接着:

/**
 * Subclasses must implement this to receive messages.
 */
public void handleMessage(@NonNull Message msg) {
}

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

其中handleMessage(@NonNull Message msg)方法的注释表明Handler子类必须实现它才能接受消息。而dispatchMessage方法的注释表明在这个方法中处理系统消息。而该方法中逻辑为当消息的回调不为空则 handleCallback此消息,如果为空则看看mCallback成员是不是不为空,然后不为空就用mCallback.handleMessage(msg)检查,如果有一些匿名类之类的会导致泄漏的存在则返回真然后直接结束方法,如果检测正常就 handleMessage此消息。

总结

后面还会看Handler的源码来记录下来,虽然前面都是乌龙,但也让我知道了Java中的Handle的一些信息,多少还是有点进步的,希望以后可以少出点错。