Support Annotation Library

2019-12-19  本文已影响0人  钦_79f7

Support Annotation Library

简介

当我们在使用Android Support Library系列库时,经常会有一个叫support-annotation的包也会出现。其实发展至今Android Support Library不再是单独的一个庞大的jar包了,而是由很多独立的子jar包组成,如support-v4、support-v7、design、cardview、compat等,而annotation也是其中之一,它包含一系列很实用的注解,来帮助开发者及时发现问题,利用lint提示,在开发者编码的时候就进行错误提示。一般这个库是不需要我们手动去添加的,因为项目中必不可免的会使用到别的support库,在别的support库中就已经依赖了这个annotation库。

compile 'com.android.support:support-annotations:25.2.0'

注解使用

Nullness

用在方法上的注解,提示当前方法的参数列表以及返回值是否可为null,做了注解之后,AS lint在开发者违反了注解标识的使用方式后,就做出相应警告提示。

@NonNull SpannableString getSS(@Nullable String string) {
        if (string == null) string = "";
        return new SpannableString(string);
    }

当违反了注解标识时,就会出现如下的lint提示:

NonNull_lint.png

资源类型注解

在封装方法时,经常会将资源的id即int整型作为形参,而我们的资源各种类型的都有,但是在R.java中都是同样的以一个int型数据来标识。这就会出现本来我需要的是一个layout的资源id,传入却是一个string的资源id的错误可能,而这些错误在编译时其实是不报错的,只有在运行时才会报错。或者在团队合作中别的开发者使用你封装的方法时,无法直接确切的知道你这个方法接收的int类型有没有限制,导致需要翻看你的源码去理解。为了避免出现这些错误以及方便使用者明确知道方法的接收类型,就可以使用资源类型注解

/**
 * Denotes that an integer parameter, field or method return value is expected
 * to be an animator resource reference (e.g. {@code android.R.animator.fade_in}).
 */
@Documented
@Retention(CLASS)
@Target({METHOD, PARAMETER, FIELD, LOCAL_VARIABLE})
public @interface AnimatorRes {
}

关于资源类型注解,源码中都是形如此的,可应用于方法、方法参数、成员属性、局部变量的注解。

类型定义注解

由于Android中不推荐使用enum,一般都是由int or String 类型的常量来替代。但是这样就缺少了参数传值的限制,使得封装调用容易出错。所以Annotation中添加了自定义类型的注解支持,来解决enum的问题

/**
 * 关于输入控件的输入状态的分类
 */
@IntDef({WatcherType.EMPTY, WatcherType.CHANGING, WatcherType.OUT_LIMIT})
@Retention(RetentionPolicy.SOURCE)//仅在源文件中有效(即.java文件中)
public @interface WatcherType {
    int EMPTY = 0;//未输入or默认状态
    int CHANGING = 1;//正常输入值的状态
    int OUT_LIMIT = 2;//超出输入限制的状态
}
/**
 * @return 对返回值的类型做了限制
 */
@WatcherType
int getWacherType() {
    return WatcherType.CHANGING;
}

关于上述代码中的@Retention(RetentionPolicy.SOURCE)注解,定义了@WacherType的生命周期,表示次注解仅在源文件代码中生效(非运行时),即自定义此注解的作用仅是在编码时做一个类型限制,减少参数误传等bug的发生。

使用示例如上述代码,当返回值不是按照注解的类型返回时,lint就会标红报错提示:

IntDef_lint.png

关于@StringDef的使用,与@IntDef的使用非常类似

线程注解

主线程中针对执行任务的操作,有个5s的限制否则就会ANR。主线程是在APP启动的时候就已经创建了,而Ui线程是针对VeiwRootImpl创建后也即是开始处理View的任务后而对主线程的另一种称呼,在VeiwRootImpl中有一个专门用于检测当前的线程的方法,而UiThread线程的出现主要是为了限制开发者只能在UiThread中更新Ui.

RGB色值注解

void setSSColor(@ColorInt int color){}
setSSColor(Color.parseColor("#ff00ff"));

值范围注解

对参数传值的范围做限制,通过下面的注解可以设置允许传值的范围or长度

权限注解

方法相关注解

@Keep混淆注解

@RestrictTo

@Dimension

待续

过滤警告注解

Android中非Support Annotation库中注解

参考

上一篇下一篇

猜你喜欢

热点阅读