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

141 阅读2分钟

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

前言

今天继续看Handler类,构造方法已经基本全部看完,后面应该是一些类的一般方法之类的内容了,继续加油。

正文

首先,我们可以看到官方又提供了三个注释为hide(隐藏)的方法:

/** @hide */
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
@NonNull
public static Handler getMain() {
    if (MAIN_THREAD_HANDLER == null) {
        MAIN_THREAD_HANDLER = new Handler(Looper.getMainLooper());
    }
    return MAIN_THREAD_HANDLER;
}

/** @hide */
@NonNull
public static Handler mainIfNull(@Nullable Handler handler) {
    return handler == null ? getMain() : handler;
}

/** {@hide} */
@NonNull
public String getTraceName(@NonNull Message message) {
    if (message.callback instanceof TraceNameSupplier) {
        return ((TraceNameSupplier) message.callback).getTraceName();
    }

    final StringBuilder sb = new StringBuilder();
    sb.append(getClass().getName()).append(": ");
    if (message.callback != null) {
        sb.append(message.callback.getClass().getName());
    } else {
        sb.append("#").append(message.what);
    }
    return sb.toString();
}

这最让我注意的就是这个hide的注释,查询了一些相关资料,它们解释:类或API是否开放,是通过doc的注释{@hide}来控制的。这表示不对外公开api,但是系统内部是可以使用该注释标记的接口的。加入了 /** {@hide} */ 注视后的类或者API是google编译时不对外开放的,但是运行的时候这写类和API都是可以访问的。
所以这三个方法应该是类自己使用的,我们不去调用它们。从方法名与方法内部内容也大致可以判断出它们应该是一些关于Handler创建时相关的操作与判断方法,第一个可以返回MAIN_THREAD_HANDLER即主线程Handler,第二个是对Handler对象的null判断后的安全返回,当Handler对象为null是获取getMain(),而不为空则返回自身,第三个方法则内容多一些,从方法名大意是获取跟踪(消息)名,可以返回Message对象的跟踪名。

总结

今天主要还是在构建Handler类的源码位置,没有涉及到我们可以直接调用的方法,下一次也要迈入常用或者重要的方法源码了,未完待续。。。