Android开发android技术专栏

请使用Support Annotations 进行代码检查

2017-08-06  本文已影响57人  发黄的小草

1.Support Annotations 是什么?

Support Annotations 是Android 官方注解支持库。(如果对 Annotation 不了解的可参考:Java Annotation)主要作用是用于在编译期间进行代码检查,能在编译期间提示代码是否符合规范,参数是否为null,是否正确等。

将以下代码行添加到 build.gradle文件的dependencies块中,即可添加support-annotations依赖

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

Support Annotations 内容

1.资源注解 

@AnimatorRes :Xml资源属性动画注解

@AnimRes :Xml资源动画

@AnyRes :能够指示注解的参数可为任意类型的R资源,但并不能区别出类型

@ArrayRes :用于指定R.array.*类型数据

@AttrRes :自定义属性 R.attr.*

@BoolRes : 指定R.bool.* Boolean类型资源

@ColorRes :指定R.color.* 颜色资源

@DimenRes:指定 R.dimen.*大小资源

@DrawableRes :图片资源 R.drawable.*

@IdRes : id 资源文件 R.id.*

@IntegerRes :int 资源id R.integer.*

@InterpolatorRes :动画插值器资源 R.interpolator.*

@LayoutRes :指定layout 资源文件 R.layout.*

@MenuRes : 指定菜单文件 R.menu.*

@RawRes : 指定本地音频文件 R.raw.*

@StringRes : 指定字符串常量 R.string.*

@StyleableRes:指定自定义属性集合 R.styleable.*

@StyleRes: 指定样式 R.style.*

@TransitionRes : 指定 过度动画资源 R.transition.*

@XmlRes : 指定xml 资源文件 R.xml.*

以上就是常用的资源注解,资源注解能帮助我们在编译期间发现方法调用,传参可能出现的问题,IDE能提前发现问题,并提示给我们。说了那么多举个栗子吧!

比如再启动一个新Activity 添加一个转场动画我们可以写这样的代码:

本来enterAnim 和 exitAnim 应该是R.anim 资源动画 但是我给他们传值R.id.basic,0发现IDE并没有提示我的参数是否合法,这样就只能运行时才能发现我的参数是错误的,这样效率真的降低了,那么现在引入注解就完全不一样了...

我们把方法参数加上@AnimRes 注解 发现IDE 会自动检查我们的参数是否正确并给出警告,这样就在编译期间发现这些bug提高效率了

使用资源注解很简单只需要在方法,变量定义处添加注解即可

调用

2.线程注解

@MainThread

@UiThread

@WorkerThread

@BinderThread

@AnyThread

@MainThread和@UiThread注解效果相同,因此可以从@MainThread方法调用@UiThread方法,反之也可。@WorkerThread 用于注解一个工作线程 @BinderThread 用于指定线程为绑定线程 @AnyThread 可以注解任何线程

3.约束注解

约束注解包括:@IntRange@FloatRange 和 @Size

@FloatRange 用于约束double 类型参数范围使用如下:

@FloatRange 注解

form double 类型 用户指定参数开始值 

to double 类型 用于指定参数最大值 

fromInclusive Boolean 类型 用于控制参数是否可以和form的值相同(默认 true)

toInclusive Boolean 类型 用于控制参数是否可以和to的值相同 (默认 true)

@IntRange 用于约束整型数据参数范围使用如下:

@IntRange 注解

使用方式和@FloatRange 一致 不过并没有fromInclusive, toInclusive 控制条件

@Size 注解可以检查集合或数组的大小,以及字符串的长度。@Size注解可用于验证以下

min 表示最小大小(例如@Size(min=2))

max 表示最大大小(例如@Size(max=2))

确切大小(例如@Size(2))

multiple 表示大小必须为此倍数的数字(例如@Size(multiple=2)) 

例如:

@Size 注解

4.权限注解

@RequiresPermission

使用@RequiresPermission注解可以检查方法调用方的权限是否拥有权限。(Android 6.0 需要动态申请隐私权限,不了解的可点此处:Android 6.0 Permissions)。

要检查有效权限列表中是否存在某个权限,请使用anyOf属性。要检查是否存在一组权限,请使用allOf属性。

@RequiresPermission 注解

startCamera() 要拥有启动照相机的权限,copyFile() 需要拥有读取和写入SD卡的权限 。对于 intent 权限,可直接将要申请的权限定义在字符串常量上。

对于需要单独读写权限的可使用@RequiresPermission.Read@RequiresPermission.Write注解 

@RequiresPermission.Write,@RequiresPermission.Read

5.返回值注解

@CheckResult 注解是用来检查实际使用的是方法的结果还是返回值。并不是标注方法返回值不是null

6.Callsuper 注解

@CallSuper注解用于检查子类重写的方法是否调用父类方法 super.*  示例:

我们先定义一个抽象类 BaseActivity 定义一个bindView()使用@CallSuper 注解

BaseActivity

之后在新建一个UserActivity 继承 BaseActivity 之后实现 bindView() 如果不加上super.bindView(); 就会提示出错 这就是 @CallSuper 注解 的作用

UserActivity

7.Typedef 注解

typedef注解包括 @IntDef@StringDef 注解。使用@IntDef@StringDef注解,以便能够创建整型和字符串集的类似枚举类型的引用。

Typedef 注解使用@interface声明新的枚举注解类型。

举个栗子 :假设我们要给一个方法传入固定类型的值怎么传?一般我们有两种做法 1:使用枚举 2:定义常量 

现在结合Typedef 就能达到以上两种要求:

getLayoutView() 是根据state 值 返回不同的view

getLayoutView

state 的值都是常量如下

state 值

在上面的getLayoutView()中我们定义的参数是 @ViewState int state 这个@ViewState 就是结合Typedef 自定义注解 使用@IntDef 固定了@ViewState 做参数的类型。

自定义@ViewState注解结合@IntDef

这样就能达到想枚举一样使用如下,它规定了state 的值,不能传入其他值,和枚举,常量等使用相同。

调用时IDE提示

8.Null ness 注解

Null ness 注解包括 @Nullable@NonNull注解 @Nullable 表示可以为null @NonNull 表示不能为null

举个例子 当用@NonNull 标识一个参数时 表示参数不能为null,当传入null IDE 就会给出提示,@Nullable 表示可以为null IDE 不做检查 ,这样我们就能根据IDE给出的提示找出原因了

@NonNull 和 @Nullable 
上一篇下一篇

猜你喜欢

热点阅读