文档章节

Annotation注解详细介绍

潇湘剑雨
 潇湘剑雨
发布于 09/23 12:03
字数 2692
阅读 15
收藏 7

目录介绍

  • 1.Annotation库的简单介绍
  • 2.@Nullable和@NonNull
  • 3.资源类型注释
  • 4.类型定义注释
  • 5.线程注释
  • 6.RGB颜色纸注释
  • 7.值范围注释
  • 8.权限注释
  • 9.重写函数注释
  • 10.返回值注释
  • 11.@Keep注释
  • 12.@SuppressWarnings注解
  • 13.其他

1.Annotation库的简单介绍

  • 包含一系列有用元注释,帮助开发者在编译期间发现可能存在的bug
  • 是属于Support Lib其中之一,独立jar包
  • 通过注释来完善自身代码质量
  • 官方文档:
    • AndroidAnnotations是一个能让你进行快速开发的开源框架,它让你关注真正重要的地方,它可以简化你的代码,并且有利于你后期的维护
  • 库的特点
    • 依赖注入(Dependency injection):支持view, extras, system service, resource等等
    • 简单的线程模型(Simplified threading model):进行方法注解以让该方法在UI线程或后台线程进行执行
    • 事件绑定(Event binding):进行方法注解以让方法执行view的时间而不用再添加一些监听
    • REST client:创建一个接口,AndroidAnnotations用来实现
    • 没有神秘感(No magic):AndroidAnnotations在编译时会产生一个子类,你可以查看子类中的代码来知道它是如何工作的.
    • 编译检测:提供的多种注解,用于检测代码编译时可能存在的异常,并给开发者相关提示,提高代码质量
    • AndroidAnnotations来实现这些美好的功能,只需要不到150kb的大小
  • 相关文档给出说明
    • androidannotations.org
    • 这篇文档给出了案例,很好地说明了注释前后代码的区别

2.@Nullable 和 @NonNull

  • 说明:
    • 检测参数或者方法返回值是否可以为null,这是该框架中最常用也是最基础的注解之一了,使用了这两个注解,在Android Studio中,如果出现代码不安全的情况下,会给出智能提示
  • @Nullable作用于函数参数或者返回值,标记参数或者返回值可以为空
  • @NonNull作用于函数参数或者返回值,标记参数或者返回值不可以为空
  • @NonNull使用举例【千万别忽视黄色警告-----这个淡黄色警告实际开发中很容易忽视】
  • 未加注释:
    • image
  • 添加注释:
    • image
    • 结论:可以看到加上的@NonNull注解后,AndroidStudio会自动检测不安全的代码并给出友好提示,提示开发者进行修改
  • @Nullable 使用举例
    • image
    • 结论:将@Nullable作用在方法上,这样方法的返回值是允许为null的,但是可能会导致某些情况下的crash;

3.资源类型注释

  • 在我们平时开发中我们肯定会经常用到引用一些资源,比如图片资源及字符串资源或者颜色值资源,因为这些资源的类型都是int值,所以有时候我们在给TextView设置字符串资源时也有可能引用了图片资源ID,就会导致有问题,比如会出现以下异常:
    • android.content.res.Resources$NotFoundException: String resource ID #0x3039
  • 资源通常是以整型值表示的,保存在R.Java文章中。如果传入资源值不对,那么编译器不会报错,但是运行期会报错。而注解可以避免这个问题。
  • 资源类型注解主要都有哪些?
    • @StringRes : 表示参数、变量或者函数返回值应该是一个字符串类型的资源
    • @ColorInt : 表示参数、变量或者函数返回值应该是一个颜色值而不是颜色资源引用,例如应该是一个 AARRGGBB 的整数值。
    • @ColorRes : 表示参数、变量或者函数返回值应该是一个 color 类型的资源,而不是颜色值。注意和 ColorInt 区别
    • @AnimRes : 表示参数、变量或者函数返回值应该是一个 Anim 类型的资源
    • @DrawableRes : 表示参数、变量或者函数返回值应该是一个 drawable 类型的资源
    • @DimenRes : 表示参数、变量或者函数返回值应该是一个 dimension 类型的资源
  • 举例子: 这里定义了一个方法,方法中只接受@StringRes注解的int引用
    • 没有添加注释前
    • image
    • 添加注释后
    • image
    • 结论:添加注释可以在编译器就找到错误

5.线程注释

  • 线程注解主要是用于检测一个函数是否在指定类型的线程中执行
  • 类型
    • @UiThread:标记运行在UI线程,一个UI线程是Activity运行所在的主窗口,对于一个应用而言,可能存在多个UI线程。每个UI线程对应不同的主窗口。
    • @MainThread:标记运行在主线程,一个应用只有一个主线程,主线程也是@UiThread线程。通常情况下,我们使用@MainThread来注解生命周期相关函数,使用@UiThread来注解视图相关函数,一般情况下@MianThread和@UiThraed是可以互换的。
    • @WorkerThread:标记运行在后台运行线程。
    • @BinderThread:标记运行在Binder线程
  • 举例子
    public void threadtest(){ 
        new Thread(new TimerTask() { 
            @Override 
            public void run() { 
                setTest(); 
            } 
        }).start(); 
    } 
    
    @UiThread 
    public void setTest(){ 
        test.setText("测试"); 
    }
    那么上面会报错。提示:不做线程切换,只起到提示作用!
    

6.RGB颜色纸注释

  • 在资源类型注解中我们使用@ColorRes来标记参数类型需要传入颜色类型的id,而使用@ColorInt注解是标记参数类型需要传入RGB或者ARGB颜色值的整型值。
  • 举例子,阅读TextView源代码中的setTextColor方法
    • image

7.值范围注释

  • 当函数参数的取值在一定范围时,可以使用注解来防止调用者传入错误的参数,主要注解有三种。
  • 第一种
    @Size:对于类似数组、集合和字符串之类的参数,我们可以使用@Size注解来表示这些参数的大小。
    用法:
    @Size(min=1)//可以表示集合不可以为空
    @Size(max=23)//可以表示字符串最大字符个数为23
    @Size(2)//表示数组元素个数为2个
    @Size(multiple=2)//可以表示数组大小是2的倍数
    
  • @IntRange:参数类型是int或者long,用法如下
    public void setInt(@intRange(from=0,to=255)){...}
    
  • @FloatRange:参数类型是float或者double,用法如下
    public void setFloat(@FloatRange(from=0.0,to=1.0)){...}
    
  • 举个例子
    • @FloatRange 用法
      • image
    • @Size用法
      • image
    • 数组只能有2个元素: @Size(2)
      • image

8.权限注释

  • Android应用在使用某些系统功能时,需要在AndroidManifest,xml中声明权限,否则在运行时就会提示缺失对应的权限,为了在编译时及时发现权限的缺失,我们可以使用@RequiresPermission注解。
  • 如果需要一个权限则加注解。
    @RequiresPermission(Manifest.permission.SET_WALLPAPER)
    
  • 如果需要一个集合至少一个权限,那么就加注解。
    @RequiresPermission(anyOf = {Manifest.permission.SET_WALLPAPER,Manifest.permission.CAMERA})
    
  • 如果同时需要多个权限,那么就加注解。
    @RequiresPermission(allOf = {Manifest.permission.SET_WALLPAPER,Manifest.permission.CAMERA})
    
  • 对于Intent调用所需权限的ACTION字符串定义处添加注解。
    @RequiresPermission(android.Manifest.permission.BLUETOOTH)
    String ACTION_REQUEST_DISCOVERRAVLE = "android.bluetooth.adapter.REQUEST_DISCOVERRAVLE";
    
  • 对于ContentProvider所需权限,可能有读和写两个操作。对应不同的权限。
    @RequiresPermission.Read(@RequestPermission(READ_HISTORY_BOOLMARKS))
    @RequiresPermission.Write(@RequestPermission(WRITE_HISTORY_BOOLMARKS))
    public static final Uri BOOKMARKS_URI = Uri.parse("content://browser/bookmarks);
    

9.重写函数注释

  • 如果API允许重写某个函数,但是要求在重写该函数时需要调用super父类的函数。
  • 可以加注解@CallSuper来提示开发者。若是重写不调用super就会报错
  • 举例子
    • image

10.返回值注释

  • 该注解是为了检测方法返回值是否是需要使用的,如果没有被使用,则AndroidStudio会给出警告提示
  • @CheckResult使用案例
  • 添加注释:
    • image

11.@Keep注释

  • @keep是用来标记在Proguard混淆过程中不需要混淆的类或者方法。在混淆时一些不需要混淆的会使用
    -keep class com.foo.bar{public static <method>}
    
  • 有了@Keep之后,就可以在编码时标注出一些不需要混淆的类或者方法

12.@SuppressWarnings注解

  • 这个注解在源码里是随处可见,其实它的用法很简单,就是对一些警告信息的过滤。
  • 源代码
    • image
  • 这个注解是可以使用在属性、方法、构造方法、变量等等。那么它的参数就是一个字符串数组。可以单个,可以多个。
  • 示例
    * @SuppressWarnings("unchecked")
    告诉编译器忽略 unchecked 警告信息,如使用List,ArrayList等未进行参数化产生的警告信息。
    * @SuppressWarnings("serial")
    如果编译器出现这样的警告信息:The serializable class WmailCalendar does not declare a static final serialVersionUID field of type long
    使用这个注释将警告信息去掉。
    * @SuppressWarnings("deprecation")
    如果使用了使用@Deprecated注释的方法,编译器将出现警告信息。
    使用这个注释将警告信息去掉。
    * @SuppressWarnings("unchecked", "deprecation")
    告诉编译器同时忽略unchecked和deprecation的警告信息。
    * @SuppressWarnings(value={"unchecked", "deprecation"})
    等同于@SuppressWarnings("unchecked", "deprecation")
    

13.其他

  • @EActivity、@ViewById、@Click
  • 这三个注解应该是对我们的代码简洁性最有帮助的
    • @EActivity : 后面需要跟上一个layout id,来标示该Activity所加载的xml布局,这样原来的onCreate()方法就不用写了;
    • @ViewById : 与findViewById作用一致,而且@ViewById后面可以不写控件id,前提是控件变量名要与控件id一致
    • @Click : 也就是控件的点击事件,而且如果控件ID与方法名一致,后面就不用写控件ID了. 该注解可以单独写,也可以对多个Button合并写
  • 代码案例
    //这里加注解就可以不写onCreate方法 
    @EActivity(R.layout.activity_test_annotation) 
    public class TestAnnotation extends AppCompatActivity { 
    
        @ViewById(R.id.tv_name)//如果变量名和控件ID一致,后面就不用写id 
        TextView tv_name; 
    
        @Click(R.id.showName)//如果控件ID与方法名一致,后面就不用写id 
        public void showName(){ 
            Toast.makeText(this,tv_name.getText(),Toast.LENGTH_SHORT).show(); 
        } 
    } 
    

关于其他内容介绍

01.关于博客汇总链接

02.关于我的博客

© 著作权归作者所有

共有 人打赏支持
潇湘剑雨
粉丝 7
博文 75
码字总数 232067
作品 0
朝阳
Spring MVC 解读——

Spring MVC 解读——mvc:annotation-driven/ 一、AnnotationDrivenBeanDefinitionParser 通常如果我们希望通过注解的方式来进行Spring MVC开发,我们都会在***-servlet.xml中加入mvc:annotat...

麦壳原野
2014/03/05
0
8
Java注解和spring标签

一、注解的意义和作用 首先要明白注解的意义和作用,才能明白在那个时候使用注解。百度百科解释Java注解是这样介绍的:Annotation(注解)即为元数据。下面为元数据的作用: 编写文档:通过代码...

小车车
2016/08/13
37
0
注解-你可能需要知道这些

在日常的开发工作中,尤其是在使用一些比较受欢迎的开源框架时,我们不可避免的都使用到了注解(Annotation),注解的使用范围也越来越广,而且在使用了注解后,我们的代码看起来也更简洁了。...

24K男
2017/09/28
0
0
安卓小技巧

安卓开发中,在低版本SDK使用高版本的API会报错。一般的处理方法是换一种实现方法,或者在高版本SDK中使用高版本API,低版本SDK中使用效果可能会差点的折衷方案;后者可以用如下技巧实现。 ...

Carbenson
2015/09/15
81
0
Annotation详解

第1部分 Annotation架构 先看看Annotation的架构图: 从中,我们可以看出: (01) Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明: Document、Inh...

小菜鸡1
2016/08/16
11
0

没有更多内容

加载失败,请刷新页面

加载更多

关于组件化的最初步

一个工程可能会有多个版本,有国际版、国内版、还有针对各种不同的渠道化的打包版本、这个属于我们日常经常见到的打包差异化版本需求。 而对于工程的开发,比如以前的公司,分成了有三大块业...

DannyCoder
37分钟前
1
0
Spring的Resttemplate发送带header的post请求

private HttpHeaders getJsonHeader() { HttpHeaders headers = new HttpHeaders(); MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8"); ......

qiang123
昨天
2
0
Spring Cloud Gateway 之 Only one connection receive subscriber allowed

都说Spring Cloud Gateway好,我也来试试,可是配置了总是报下面这个错误: java.lang.IllegalStateException: Only one connection receive subscriber allowed. 困扰了我几天的问题,原来...

ThinkGem
昨天
25
0
学习设计模式——观察者模式

1. 认识观察者模式 1. 定义:定义对象之间一种一对多的依赖关系,当一个对象状态发生变化时,依赖该对象的其他对象都会得到通知并进行相应的变化。 2. 组织结构: Subject:目标对象类,会被...

江左煤郎
昨天
2
0
emoji

前言:随着iOS系统版本的升级,对原生emoji表情的支持也越来越丰富。emoji表情是unicode码中为表情符号设计的一组编码,当然,还有独立于unicode的另一套编码SBUnicode,在OS系统中,这两种编...

HeroHY
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部