美文网首页Android开发android技术专栏
请使用Support Annotations 进行代码检查

请使用Support Annotations 进行代码检查

作者: 发黄的小草 | 来源:发表于2017-08-06 19:56 被阅读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 

    相关文章

      网友评论

        本文标题:请使用Support Annotations 进行代码检查

        本文链接:https://www.haomeiwen.com/subject/eybilxtx.html