您当前的位置:首页 > 电脑百科 > 程序开发 > 移动端 > Android

Android如何使用注解进行代码检查

时间:2019-09-16 13:42:13  来源:  作者:
Android如何使用注解进行代码检查

 

Android Studio 内置了代码检查工具 Lint,可在菜单栏选择 Analyze > Inspect Code 执行相应的代码检查,代码检查能够根据推断一些不合法的潜在问题,有助于在开发阶段发现开发者因为主管原因导致的一下代码问题,Android 官方提供了注解库 support-annotations 来帮助开发者及早发现问题,下面是常用的一些注解,主要内容如下:

  1. Nullness注解
  2. 资源注解
  3. 线程注解
  4. 值约束注解
  5. 权限注解
  6. 返回值注解
  7. CallSuper注解
  8. Typedef注解
  9. 可访问性注解

Nullness注解

使用 Nullness 注解可以检查给定变量、参数和返回值是否允许 null 值,具体如下:

  • @Nullable :表示可以为 null 的变量、参数或返回值,
  • @NonNull :表示不可为 null 的变量、参数或返回值。
Android如何使用注解进行代码检查

 

资源注解

资源注解的使用可使得在源码阶段让编辑器检查书写的不规范,也可在一定程度上优化代码结构,下面是常见的资源注解如下:

  • @StringRes: 表示检查是否包含R.string引用
  • @ColorRes: 表示检查是否包含R.color引用
  • @ColorInt: 表示检查是否包含表示颜色的整型
  • @DrawableRes: 表示检查是否包含R.drawable引用
  • @DimenRes: 表示检查是否包含R.dimen引用
  • @InterpolatorRes:表示检查是否包含插值器引用

线程注解

线程注解可以检查某个方法是否从某个特定类型的线程中调用,支持一下线程注解,具体如下:

  • @MainThread:表示主线程
  • @UiThread:表示 UI 线程
  • @WorkerThread:表示工作线程
  • @BinderThread:表示Binder线程
  • @AnyThread:表示任何一个线程

上述注解中 @MainThread 和 @UiThread 在大多时候表示的都是同一线程,如果应用中带有多个试图,UI 线程可与主线程不同,故可使用 @UIThread 标注与应用的视图层次相关联的方法,使用 @MainThread 仅标注与应用生命周期相关联的方法。线程注解最常用的一个用途是 AsyncTask 使用中的方法替换,因为 AsyncTask 会执行后台操作并将结果发布到 UI 线程。

值约束注解

使用值约束注解可验证传递的参数的值的合法性,可以借此指定参数的设置范围,可在一定程度上减少代码在主观程度上出现的错误,常见的值约束注解如下:

  • @IntRange:表示可以验证整型参数是否在指定范围内
  • @FloatRange:表示可以验证浮点型参数是否在指定范围内
  • @Size:表示可以验证集合、数组、字符串参数是否在指定范围内,可指定最大值、最小值以及确切值

上面的注解有一些可使用的参数,如 from、to、min 等,使用时具体在某个注解体重查看定义即可。

权限注解

权限注解 @RequiresPermission 可以验证方法调用方的权限,即当使用了权限注解的方法时会检查有没有指定的权限,如果没有则会提示要在 AndroidManifest.xml 文件中申明权限,如果是危险权限还有进行权限动态申请,使用方式参考如下:

Android如何使用注解进行代码检查

 

返回值注解

返回值注解 @CheckResult 会检查某个方法的返回值是否被使用,如果没有被使用,则会根据 suggest 配置建议使用相同公民没有返回值的另一个方法,如果返回值使用了,则和未加该注解的方法一样,使用方式参考如下:

@CheckResult(suggest="#enforcePermission(String,int,int,String)")
public int checkPermission(@NonNull String permission, int pid, int uid){
 return 0;
}

如果没有使用返回值提示如下:

Android如何使用注解进行代码检查

 

当返回值没有被使用,则会建议使用相同功能没有返回值的另一个方法,简而言之,返回值注解 @CheckResult 能够表示某个方法实际使用的时方法本身的处理还是方法最终的处理结果。

Android如何使用注解进行代码检查

 

CallSuper注解

使用 @CallSuper 注解会验证子类的重写方法是否调用父类的实现,这样约束的好处是可保证父类的实现不会修改,当然,如果不使用该注解,子类重写父类的方法可以不调用弗父类的默认实现,具体参考如下:

Android如何使用注解进行代码检查

 

下面是 Test 类的实现类:

Android如何使用注解进行代码检查

 

Typedef注解

使用 @IntDef 和 @StringDef 注解 可以创建整型和字符串的枚举注解来验证其他代码中使用的某些整型和字符串,可以保证代码中的某些常量整型或常量字符串是某些具体定义的常量集,这两个注解的位置只能是注解。

开发中总会使用到枚举,枚举在一定程度上可使得代码结构更清晰,但枚举的使用会增加内存的开销,这里可以用 Typedef 注解的方式来代替枚举,下面是 Tyoedef 注解的使用,参考如下:

Android如何使用注解进行代码检查

 

下面是上述 Typedef 注解的使用方式,参考如下:

Android如何使用注解进行代码检查


可见 Typedef 注解约束了使用到的某些整型,当然还可以是字符串,这样也能达到枚举的作用。

 

可访问性注解

可访问性注解是 @VisibleForTesting 和 @Keep 可以表示方法、字段、类的可访问性。具体如下:

  • @VisibleForTesting:表示注解的某个代码块的可见性高于能够测试时需要的水平
  • @Keep:表示被注解的代码块将不会被混淆。

最常用的可能就是资源注解,如 @StringRes、@ColorRes、@ColorInt等,还有Typeof 注解,该注解可以在替换枚举在 Android 开发中带来的性能影响,如果平时留意这些注解在 Android 源码中也经常使用,所以可在开发过程中尝试去使用这些注解以进行必要的代码检查。

最后

如果你看到了这里,觉得文章写得不错就给个赞呗!欢迎大家评论讨论!如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足,定期免费分享技术干货。谢谢!



Tags:Android   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
今天面试遇到同学说做过内存优化,于是我一般都会问那 Bitmap 的像素内存存在哪?大多数同学都回答在 java heap 里面,就比较尴尬,理论上你做内存优化,如果连图片这个内存大户内存...【详细内容】
2021-12-23  Tags: Android  点击:(8)  评论:(0)  加入收藏
Android logcat日志封装logcat痛点在Android开发中使用logcat非常频繁,logcat能帮我们定位问题,但是在日常使用中发现每次使用都需要传递tag,并且会遇到输出频率很高的log,在多...【详细内容】
2021-12-22  Tags: Android  点击:(8)  评论:(0)  加入收藏
对项目的基本介绍 1.整个框架主要是给MVVM框架使用的,自己写完interface接口后,通过自定义的注解就能自动生成接口方法 2.用Kotlin的Flow去代替Rxjava,因为我发现RxJava功能很...【详细内容】
2021-12-08  Tags: Android  点击:(17)  评论:(0)  加入收藏
前言在Android开发过程中,有些时候会根据需要引用别的项目到当前项目里面,而且以Module形式引用。所以本篇博文就来分享一下怎么以Module形式引用别的项目到当前项目中,方便开...【详细内容】
2021-12-07  Tags: Android  点击:(22)  评论:(0)  加入收藏
新型Android恶意木马程序伪装成数十款街机、射击和策略游戏,通过华为应用市场AppGallery进行分发,从而窃取设备信息和用户的手机号码,全球目前至少有930万台Android设备被该恶...【详细内容】
2021-12-01  Tags: Android  点击:(24)  评论:(0)  加入收藏
作者:fundroid这篇文章偏阅读一些,大家可以了解下 Android 的一些最新动向。每年9/10月份 Google 都会举行约为期2天的 Android Dev Summit,在活动上 Google 的技术专家们会分...【详细内容】
2021-11-30  Tags: Android  点击:(15)  评论:(0)  加入收藏
一、 准备工作1、安装JDK,下载地址(可能需要一个oracle账号,大家百度一下或者自行注册一个就行。尽可能选择8或者11,这两个是长期版本)Java SE | Oracle Technology Network | Or...【详细内容】
2021-11-23  Tags: Android  点击:(28)  评论:(0)  加入收藏
如果你是一名忠实的Android玩家,那么可能会知道,今年的Android 12系统在版本规划上与“往届”相比可以说是很有些特殊。具体来说,除了前段时间刚刚推出正式版的Android 12外,谷...【详细内容】
2021-11-10  Tags: Android  点击:(24)  评论:(0)  加入收藏
使用Maven Publish Plugin插件。(官方支持)一、在Library的build.gradle中配置plugins { id 'com.android.library' id 'kotlin-android' id 'k...【详细内容】
2021-11-05  Tags: Android  点击:(37)  评论:(0)  加入收藏
今年5月,谷歌推出了Android 12,这是原生安卓系统史上最大的设计变化,10月4日,谷歌推出全新的Android12正式版本,并且宣布会在今年晚些时候应用于安卓设备,对比Android11的挤牙膏式...【详细内容】
2021-10-29  Tags: Android  点击:(125)  评论:(0)  加入收藏
▌简易百科推荐
今天面试遇到同学说做过内存优化,于是我一般都会问那 Bitmap 的像素内存存在哪?大多数同学都回答在 java heap 里面,就比较尴尬,理论上你做内存优化,如果连图片这个内存大户内存...【详细内容】
2021-12-23  像程序那样思考    Tags:Android开发   点击:(8)  评论:(0)  加入收藏
Android logcat日志封装logcat痛点在Android开发中使用logcat非常频繁,logcat能帮我们定位问题,但是在日常使用中发现每次使用都需要传递tag,并且会遇到输出频率很高的log,在多...【详细内容】
2021-12-22  YuCoding    Tags:Android   点击:(8)  评论:(0)  加入收藏
对项目的基本介绍 1.整个框架主要是给MVVM框架使用的,自己写完interface接口后,通过自定义的注解就能自动生成接口方法 2.用Kotlin的Flow去代替Rxjava,因为我发现RxJava功能很...【详细内容】
2021-12-08  网易Leo    Tags:Android开发   点击:(17)  评论:(0)  加入收藏
前言在Android开发过程中,有些时候会根据需要引用别的项目到当前项目里面,而且以Module形式引用。所以本篇博文就来分享一下怎么以Module形式引用别的项目到当前项目中,方便开...【详细内容】
2021-12-07  网易Leo    Tags:Android开发   点击:(22)  评论:(0)  加入收藏
作者:fundroid这篇文章偏阅读一些,大家可以了解下 Android 的一些最新动向。每年9/10月份 Google 都会举行约为期2天的 Android Dev Summit,在活动上 Google 的技术专家们会分...【详细内容】
2021-11-30  像程序那样思考    Tags:Android开发   点击:(15)  评论:(0)  加入收藏
一、 准备工作1、安装JDK,下载地址(可能需要一个oracle账号,大家百度一下或者自行注册一个就行。尽可能选择8或者11,这两个是长期版本)Java SE | Oracle Technology Network | Or...【详细内容】
2021-11-23  永沧    Tags:Android   点击:(28)  评论:(0)  加入收藏
使用Maven Publish Plugin插件。(官方支持)一、在Library的build.gradle中配置plugins { id 'com.android.library' id 'kotlin-android' id 'k...【详细内容】
2021-11-05  羊城小阳    Tags:Android   点击:(37)  评论:(0)  加入收藏
谷歌离推出Play Store应用程序的新数据隐私部分又近了一步。应用程序开发人员现在可以通过谷歌在Play控制台的新 "数据安全表 "填写相关细节。该公司表示,所需信息将从2022年...【详细内容】
2021-10-20    中关村在线  Tags:安卓   点击:(58)  评论:(0)  加入收藏
架构究竟是什么?如何更好的理解架构?我们知道一个APP通常是由class组成,而这些class之间如何组合,相互之间又如何产生作用,就是影响这个APP的关键点。细分的话我们可以将其分为类...【详细内容】
2021-09-17  像程序那样思考    Tags:Android架构   点击:(52)  评论:(0)  加入收藏
概述当Android应用程序需要访问设备上的敏感资源时,应用程序开发人员会使用权限模型。虽然该模型使用起来非常简单,但开发人员在使用权限时容易出错,从而导致安全漏洞。本文中,...【详细内容】
2021-09-07  SecTr安全团队    Tags:Android开发   点击:(66)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条