资讯专栏INFORMATION COLUMN

Annotation注解详细介绍

callmewhy / 2381人阅读

摘要:表示参数变量或者函数返回值应该是一个类型的资源,而不是颜色值。举例子,阅读源代码中的方法值范围注释当函数参数的取值在一定范围时,可以使用注解来防止调用者传入错误的参数,主要注解有三种。使用这个注释将警告信息去掉。

目录介绍

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使用举例【千万别忽视黄色警告-----这个淡黄色警告实际开发中很容易忽视】

未加注释:

添加注释:

结论:可以看到加上的@NonNull注解后,AndroidStudio会自动检测不安全的代码并给出友好提示,提示开发者进行修改

@Nullable 使用举例

结论:将@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引用

没有添加注释前

添加注释后

结论:添加注释可以在编译器就找到错误

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方法

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 用法

@Size用法

数组只能有2个元素: @Size(2)

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就会报错

举例子

10.返回值注释

该注解是为了检测方法返回值是否是需要使用的,如果没有被使用,则AndroidStudio会给出警告提示

@CheckResult使用案例

添加注释:

11.@Keep注释

@keep是用来标记在Proguard混淆过程中不需要混淆的类或者方法。在混淆时一些不需要混淆的会使用

-keep class com.foo.bar{public static }

有了@Keep之后,就可以在编码时标注出一些不需要混淆的类或者方法

12.@SuppressWarnings注解

这个注解在源码里是随处可见,其实它的用法很简单,就是对一些警告信息的过滤。

源代码

这个注解是可以使用在属性、方法、构造方法、变量等等。那么它的参数就是一个字符串数组。可以单个,可以多个。

示例

告诉编译器忽略 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.关于博客汇总链接

1.技术博客汇总

2.开源项目汇总

3.生活博客汇总

4.喜马拉雅音频汇总

5.其他汇总

02.关于我的博客

我的个人站点:www.yczbj.org,www.ycbjie.cn

github:https://github.com/yangchong211

知乎:https://www.zhihu.com/people/...

简书:http://www.jianshu.com/u/b7b2...

csdn:http://my.csdn.net/m0_37700275

喜马拉雅听书:http://www.ximalaya.com/zhubo...

开源中国:https://my.oschina.net/zbj161...

泡在网上的日子:http://www.jcodecraeer.com/me...

邮箱:yangchong211@163.com

阿里云博客:https://yq.aliyun.com/users/a... 239.headeruserinfo.3.dT4bcV

segmentfault头条:https://segmentfault.com/u/xi...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/77224.html

相关文章

  • APT案例之点击事件

    摘要:杨充一定时间内该点击事件只能执行一次用来修饰这是一个什么类型的注解。杨充自定义编译器获取遍历,并生成代码配置文件文件配置的作用是向系统注册自定义注解处理器,执行编译时使用进行处理。 目录介绍 01.创建项目步骤 1.1 项目搭建 1.2 项目功能 02.自定义注解 03.创建Processor 04.compiler配置文件 05.编译jar 06.如何使用 07.编译生成代...

    cyixlq 评论0 收藏0
  • 关于Apt注解实践与总结【包含20篇博客】

    摘要:使用实现功能运行期注解案例使用简单的注解,便可以设置布局,等效于使用实现路由综合型案例比较全面的介绍从零起步,一步一步封装简易的路由开源库。申明注解用的就是。返回值表示这个注解里可以存放什么类型值。 YCApt关于apt方案实践与总结 目录介绍 00.注解系列博客汇总 01.什么是apt 02.annotationProcessor和apt区别 03.项目目录结构 04.该案例作用 ...

    gnehc 评论0 收藏0
  • Sentinel: 使用注解限流

    摘要:要使用注解来保护资源需要引入下面的依赖引入之后我们需要配置切面让其生效,因为是通过切面来实现的,我这边以中使用进行配置示列然后在需要限制的方法上加注解即可错误发生在表示资源名,必填项处理的方法名,可选项。 在前面我们对Sentinel做了一个详细的介绍,可以手动的通过Sentinel提供的SphU类来保护资源。这种做法不好的地方在于每个需要限制的地方都得写代码,从 0.1.1 版本开始...

    Kross 评论0 收藏0
  • 手写Spring之DI依赖注入

    摘要:如感兴趣,可移步手写之基于动态创建对象手写之基于注解动态创建对象今天将详细介绍如何手写依赖注入,在运行过程中如何动态地为对象的属性赋值。完成后在中会有相关的包出现进行注入前需要创建工厂,在运行时从工厂中取出对象为属性赋值。 前两篇文章介绍了关于手写Spring IOC控制反转,由Spring工厂在运行过程中动态地创建对象的两种方式。如感兴趣,可移步: 手写Spring之IOC基于xml...

    Cruise_Chan 评论0 收藏0
  • 注解就这么简单

    摘要:上面在将注解信息注入到方法中的时候,我们最后加上了的注解不然就会报错了那它是干什么用的呢只能用于修饰其他的,用于指定被修饰的被保留多长时间。 前言 今天要讲的是注解,对于本章节,最好是有Servlet基础的人查阅~因为单纯是Java基础的话,可能用不上注解这个东西。但如果开发过Servlet,就对@WebServlet不会陌生。 现在的开发都推崇使用注解来进行开发,这样就可以免去写XM...

    FrozenMap 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<