如何使用
如果你是使用的appcomat库,那么你就不需要导入注解库,因为appcompat库也依赖了它,如果不是,选中项目,按F4打开Project Structure对话框,首先在左边选中module,然后在右边选中Dependencies标签页,点击面板底部的+按钮,选择Library Dependency,com.android.support:support-annotations:27.1.1
(第一个)就是我们需要的注解库了,导入进来。
注解使用介绍
注解主要用在类,构造方法,成员变量,方法,参数等的声明中,作用主要是对编译器警告等辅助工具产生影响,如果传递了错误的类型那么编译器就会发出警告,这样就能保证这是一份类型安全的代码,用于写底层框架,开源框架,sdk等非常有用。注解主要有以下类
资源型注解
通常都是以Res
结尾,例如AnimatorRes
,AnimRes
,通常都是用于对资源的类型安全的检查作用,例如:
public void setColor(@ColorRes int color){
this.color = color;
}
此处的@ColorRes
就表示传递的资源类型必须是类似R.color.red
等的颜色资源,传入别的编译器将会发出警告,通常都是以什么开头的就是校验什么类型的资源
类型注解
例如@IntDef
,官方给出了一个示例:
Retention(SOURCE)
@IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST,
NAVIGATION_MODE_TABS})
public @interface NavigationMode {}
public static final int NAVIGATION_MODE_STANDARD = 0;
public static final int NAVIGATION_MODE_LIST = 1;
public static final int NAVIGATION_MODE_TABS = 2;
...
public abstract void setNavigationMode(@NavigationMode int mode);
public abstract int getNavigationMode();
NavigationMode
是我们创建的一个新注解并且用@IntDef
标注它,通过@IntDef
我们为返回值或者参数指定了可用的常量值。我们还添加了@Retention(RetentionPolicy.SOURCE)
告诉编译器这个新定义的注解不需要被记录在生成的.class文件中(译者注:源代码级别的,生成class文件的时候这个注解就被编译器自动去掉了)。
使用这个注解后,如果你传递的参数或者返回值不在指定的常量值中的话,IDE将会发出警告告诉你只能传递指定的常量,其余的@StringDef
,@LongDef
也是同理。
线程类注解
如果一个方法执行相对耗时,需要让他运行在指定的线程中,那么线程注解就派上用场了,线程类注解有:
@UiThread UI线程
@MainThread 主线程
@WorkerThread 子线程
@BinderThread 绑定线程
例如绑定了@UiThread的方法如果没有运行在ui线程,那么编译器将会发生警告,最好的使用场景就是在非UI线程的方法中加入@WorkerThread,如果你在此方法中调用了UI相关的方法,那么编译器将会发生警告,从而避免在子线程中更新UI。
数值约束
如果在一个参数中,你只想取0-100之间的数字,超过就会发生警告怎么做,这时@Size, @IntRange, @FloatRange
等注解就排上用场啦,来看看怎么使用把:
最常见的就是设置透明度了:
public void setAlpha(@FloatRange(from=0.0, to=1.0) float alpha) {
此处规定alpha数值只能从0.0 - 1.0之间。
此外还有个强大的@Size
注解:它可以指定数组或字符串的长度,最大值,最小值,倍数,例如:
集合不能为空: @Size(min=1)
字符串最大只能有23个字符: @Size(max=23)
数组只能有2个元素: @Size(2)
数组的大小必须是2的倍数 :@Size(multiple=2)
权限注解: @RequiresPermission
有时我们调用某些方法需要特定的权限,这时权限注解就排上用场啦,我们可以指定执行这个函数需要什么权限:
@RequiresPermission(Manifest.permission.SET_WALLPAPER)
public abstract void setWallpaper(Bitmap bitmap) throws IOException;
如果你需要多个权限,可以使用allof
@RequiresPermission(allOf = {
Manifest.permission.READ_HISTORY_BOOKMARKS,
Manifest.permission.WRITE_HISTORY_BOOKMARKS})
如果只需要多个权限中的一个,可以使用anyOf
@RequiresPermission(anyOf= {
Manifest.permission.READ_HISTORY_BOOKMARKS,
Manifest.permission.WRITE_HISTORY_BOOKMARKS})
重载注解@CallSuper
如果你的方法允许被重载但是需要父方法的代码也被调用(也就是保留super)就可以使用该注解,一旦使用者重载了此方法并将super.(xxx)删除那么编译器将会发生警告
网友评论