预知Bug的神器——Support Annotation Library使用详解

本文介绍了Android Support Annotation Library,包括从19.1版本开始引入的39种注解,涵盖Nullness注解、资源类型注解、类型定义注解、线程注解等。通过这些注解可以帮助开发者在编译阶段发现潜在的错误。

Support Annotation Library 是从 Android Support Library 19.1 开始引入的一个全新的函数库,它包含了一系列有用的元注解,用来帮助开发者在编译期间发现可能存在的 Bug。

Annotation Library 默认情况下不会包含在工程中,如果我们的 SDK 已经安装了 Android Support Repository,那么我们可以通过打开工程的 Project Structure 对话框,并选中一个 Module,选中 DependDencies 选项卡,点击 “+” 按钮,在弹出的 Choose library Dependency 对话框中轻松找到 Annotation Library,如图:image.png

在 support-annotations:28.0.0-alpha1 函数包中,总共包含 39 种注解,下面我们按照类型分别进行介绍。

Nullness 注解

该类型下的注解只有两个

  • @Nullable:作用于函数参数或者返回值,标记参数或者返回值可以为 null
  • @NotNull:作用于参数或者返回值,标记参数或者返回值不可以为 null

当出现这种违反标记的代码时,Android Studio 会给出提示,同时使用 Android Lint 进行静态代码扫描,也会显示出错提示。

资源类型注解

我们知道资源在 Android 中通常是以整型值表示的,并保存在 R.Java 文件中。这意味着一个需要传入 Layout 资源值得函数,如果传入 String 资源值不会再编译期报错,只有在运行时执行到相应的代码才能发现问题,则使用资源类型注解可以防止这种情况的出现。

资源类型的注解作用于函数参数,返回值及类的变量,每种资源类型对应一个注解:

AnimatorRes:标记整型值是 android.R.animator 类型
AnimRes:标记整型值是 android.R.anim 类型
AnyRes:标记整型值是任何一种资源类型,如果确切知道是哪一种具体资源的话,建议显式指定
ArrayRes:标记整型值是 android.R.array 类型
AttrRes:标记整型值是 android.R.attr 类型
BoolRes:标记整型值是布尔类型
ColorRes:标记整型值是 android.R.color 类型
DrawableRes:标记整型值是 android.R.drawable 类型
FractionRes:标记整型值是 fraction 类型,这个比较少见,这种类型的资源常见于 Animation Xml 中,比如 50%p,表示占 parent 的 50%
IdRes:标记整型值是 android.R.id 类型
IntegerRes:标记整型是 android.R.inter 类型
InterpolatorRes:标记整型值是 android.R.interpoloator 类型
LayoutRes:标记整型值是 android.R.layout 类型
MenuRes:标记整型值是 android.R.menu 类型
PluralsRes:标记整型值是 android.R.plurals 类型
RawRes:标记整型值是 android.R.raw 类型
StringRes:标记整型值是 android.R.string 类型
StyleableRes:标记整型值是 android.R.styleable 类型
StyleRes:标记整型值是 android.R.style 类型
TransitionRes:标记整型值是 android.R.transition 类型
XmlRes:标记整型值是 android.R.xml 类型

来看一个例子,就比如我们的 AppCompatActivity的setContentView 函数就是使用了 LayoutRes 注解表示它的参数:

@Override
    public void setContentView(@LayoutRes int layoutResID) {
        getDelegate().setContentView(layoutResID);
    }

使用 LayoutRes 注解标记后,如果我们在函数中调用 setContentView 函数时传入的参数不是 R.layout 类型,而是其他资源类型(例如 R.id 类型)那么 Android Studio 会提示错误:

image.png

类型定义注解

在 Android 开发中,整型值不只经常用来代表资源引用值,而且经常用来代替枚举值,@IntDef 注解用来创建一个整型类型定义的新注解,我们可以使用这个心注解来标记自己编写的 API,而 @IntDef 在我们常用的 ActionBar 这个类中就可以找到具体的使用方式:

public abstract class ActionBar {
//定义可以接收的常量列表
@IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})
//定义 NavigationMode 注解
public @interface NavigationMode {}
//定义常量
public static final int NAVIGATION_MODE_STANDARD = 0;
public static final int NAVIGATION_MODE_LIST = 1;
public static final int NAVIGATION_MODE_TABS = 2;

@NavigationMode
public abstract int getNavigationMode();

public abstract void setNavigationMode(@NavigationMode int mode);
......

在使用 setNavigationMode 这个 API 时,如果传入的参数 mode 不是三个常量值之一,那么 Android Studio 就会给出警告。

线程注解

Android 应用开发过程中,经常会涉及多线程的使用,界面相关操作必须在主线程,而耗时操作例如文件下载等则需要放到后台线程中,线程相关注解有四种。

  • @UiThread:标记运行在 UI 线程,一个 UI 线程是 Activity 运行所在的主窗口,对于一个应用而言,可能粗才能在多个 UI 线程,每个 UI 线程对应不同的主窗口。
  • @MainThread:标记运行在主线程,一个应用只有一个主线程,主线程也是 @UIThread 线程,通常情况下,我们使用 @MainThread 来注释申明周期相关函数,使用 @UIThread 来注解视图相关函数,一般情况下,@MainThread 和 @UIThread 是可互换使用的。
  • @WorkerThread:标记运行在后台线程
  • @BinderThread:标记运行在 Binder 线程

一个典型的例子是 AsyncTask 的实现,我们看下内部实现:

@MainThread
protected void onPreExecute(){}
@WorkerThread
protected abstract Result doInBackground(Params ... params){};
@MainThread
protected void onProgressUpdate(Progress ... values){};

RGB颜色值注解

在资源类型中使用 @ColorRes 来标记参数类型需要传入颜色类型的资源 id,@ColorInt 注解则是标记参数类型需要传入 RGB 或者 ARGB 颜色整型值。在 TextView 的源码中可以找到使用 @Color 的例子。

public void setTextColor(@ColorInt int color){
  mTextColor = ColorStateList.valueOf(color);
  updateTextColors();
}

值范围注解

当函数的取值范围在一定范围内时,可以使用值范围注解来防止调用者传入错误的参数,这种类型主要有三种注解

  • @Size:对于类似数组、集合和字符串之类的参数,我们可以使用 @Size 注解来标识这些参数的大小,用法如下:
    – @Size(min=1):表示集合不可以为空
    –@Size(max=23):表示字符串最大字符个数是 23
    –@Size(2):表示数组元素个数是 2 个
    –@Size(multiple=2):表示数组的大小必须是 2 的倍数

  • @IntRange:表示参数类型是 int 或者 long

 public void setAlpha(@IntRange(from=0,to=255) int alpha) {...}
  • @FloatRange:表示参数类型是 float 或者 double
 public void setAlpha(@FloatRange(from=0.0,to=1.0) int alpha) {...}

权限注解

Android 应用在使用某些系统功能是,需要在 AndroidManifest.xml 中申明权限,否则在运行时会提示缺失对应的权限。为了在编译器及时发现缺失的权限,我们可以使用 @RequiresPermission 注解

  • 如果函数调用需要声明一个权限,语句如下:
@ RequiresPermission(Manifest.permission.SET.WALLPAPER)
public abstract void setWallpaper(Bitmap bitmap) throws IOException;
  • 如果函数调用需要声明集合中最少一个权限,语句如下:
@ RequiresPermission(anyof = {
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS.FINE_LOCATION})
public abstract void setWallpaper(Bitmap bitmap) throws IOException;

重写函数注解

如果 API 运行调用者重写某个函数,但同时要求重写的函数需要调用被重写的函数,否则代码逻辑可能会错误,那么可以使用 @CallSuper 注解来进行提示,语句如下:

@CallSuper
protected void onCreate(@Nullable Bundle saveInstanceState);

返回值注解

如果我们编写的函数需要调用者对返回值做某些处理,那么可以使用@CheckResult 注解来进行提示。当然我们没有必要对每个非空返回值的函数都添加这个注解,该注解的主要目的是让调用者在使用 API 时不至于怀疑该函数是否会产生副作用。在 Android 源码中,Context 类的 checkPremission 函数使用了该注解(自行查看吧)

@VisibleForTesting

单元测试中可能需要访问到一些不可见的类、函数或者变量,这时可以使用 @VisibleForTesting 注解来使其对测试可见

@Keep

@Keep 注解用来标记在 Proguard 混淆过程中不需要混淆的类或者方法。如果你曾经在编写混淆文件时使用过,那么 @Keep 的用法很简单

- keep class com.foo.bar {public static <methods> }

如果有了 @Keep 注解,则可以在代码编写过程中对不需要混淆的类或者方法直接标记即可
“`
public class AnnotaionDemo{
@Keep
public void doSomething(){
…..
}
……
}

最后说明一下,如果函数库中使用 Annotation Library,并使用 Gradle 生成 aar 压缩包,那么在编译时 Android Gradle 插件会抽出这些注解信息并打包在 aar 文件中,以便函数库的调用者正常使用我们的注解信息。aar 文件中的 annotation.zip 文件就是抽取出来的注解信息

内容概要:本文介绍了一种基于多目标粒子群算法(MOPSO)的微电网优化调度模型,综合考虑风能、光伏、储能系统、柴油发电机、燃气轮机以及与主电网之间的能量交互等多种分布式能源的协同运行。通过构建以运行成本最小化、碳排放最低化和系统可靠性最优化为目标的多目标优化模型,利用Matlab平台实现MOPSO算法求解,完成对微电网在不同运行场景下的能量管理与调度方案优化。该模型能够有效平衡经济性与环保性之间的关系,适用于含多类型分布式电源的复杂微电网系统,具有较强的工程应用价值和科研参考意义; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及工程技术人员,尤其适合从事微电网、智能电网、综合能源系统、可再生能源集成与优化调度等领域研究的专业人士; 使用场景及目标:①用于多能源耦合微电网系统的协同优化调度研究;②支持多目标智能优化算法在能源系统中的建模与求解实践,帮助用户掌握MOPSO在实际工程问题中的应用方法;③为学术论文复现、毕业设计、科研项目开发提供完整的代码实例与技术支撑; 阅读建议:建议读者结合Matlab代码与理论文档,深入理解目标函数构建、约束条件处理及Pareto最优解集生成机制,重点关注算法参数设置、多目标权衡分析与结果可视化,并可通过调整能源配置或引入新约束进行二次开发与创新研究。
内容概要:本文系统研究了基于模型预测控制(MPC)的滚动优化方法在微电网多时间尺度能量管理调度中的应用。通过构建包含风能、光伏、储能等多种分布式能源的微电网综合系统模型,充分利用MPC的前瞻性预测与滚动优化机制,实现对系统内部能量流的精细化、动态化调控。研究重点解决了新能源出力强不确定性带来的调度挑战,兼顾系统运行的经济性、稳定性与可靠性,在日前、日内及实时等多个时间尺度上实现了优化决策的协同。文中配套提供了完整的Python代码实现,涵盖模型构建、约束处理、目标函数设定与求解全过程,具有较强的可复现性与工程参考价值。; 适合人群:具备一定电力系统、优化理论基础和Python编程能力的研究生、科研人员及从事微电网、综合能源系统、能源互联网等领域研究的工程技术人员。; 使用场景及目标:①深入理解MPC在复杂能源系统调度中的核心原理与技术优势;②学习并复现多时间尺度滚动优化的完整建模与求解流程;③为微电网能量管理系统(EMS)的开发、相关学术研究或工程项目提供直接的算法实现参考与技术支撑; 阅读建议:建议读者结合所提供的Python代码进行逐行研读与调试,亲自动手修改系统参数、负荷曲线或新能源出力数据,以深刻体会MPC算法的动态响应特性与优化效果,进而在此基础上开展二次开发与创新性研究。
智能安防是依托人工智能、大数据、物联网等前沿技术构建的新一代安全防护体系,彻底打破了传统安防“被动监控、事后追溯”的局限。它不再是孤立的摄像头、门禁和报警器的简单组合,而是通过全域感知设备的互联互通,实现对人员、车辆、环境等多维度数据的实时采集与智能分析。从社区出入口的人脸无感通行、异常行为识别,到道路上的违章智能抓拍、重点区域的入侵预警,再到企业园区的消防隐患预判、设备故障自动告警,智能安防能在毫秒级完成风险研判,把安全防线从“事后处置”前移到“事前预防”。如今,它早已渗透到城市治理、居家生活、商业运营等各类场景,成为守护公共安全与私人空间的核心技术支撑。 不同于传统安防依赖人工盯守的高成本模式,智能安防凭借算法的持续迭代,不断拓展安全防护的边界。它可以通过对历史数据的深度挖掘,提前识别人群聚集、消防通道占用等潜在风险,联动公安、物业、应急等多部门快速响应,大幅降低安全事件的发生概率和处置时长。在老旧小区改造中,智能安防设备的加装解决了过去流动人口管理难、高空抛物溯源难等长期痛点;在家庭场景里,智能门锁、可视门铃、燃气泄漏报警器等设备组成的居家安防网络,让用户通过手机就能随时掌握家中安全状态。随着数字城市建设的推进,智能安防正从单一的安全工具,进化为构建智慧城市安全底座的关键组成部分,为人们的日常工作与生活筑牢更高效、更精准的防护屏障。
内容概要:本文针对“考虑算力负荷时空迁移特性的多微电网-共享储能协同优化调度”开展深入研究,提出了一种融合算力负荷动态迁移特征的多微电网系统协同优化模型,并基于Matlab完成仿真代码实现。研究核心在于揭示算力负荷(如数据中心、边缘计算等)与电力负荷之间的耦合关系,通过引入共享储能机制实现多微电网间的能量互补与灵活调度,从而提升系统在复杂时空负荷环境下的运行经济性、稳定性与能源利用效率。文中系统阐述了模型架构设计、多目标优化函数构建(涵盖成本最小化、可再生能源消纳最大化等)、关键约束条件(如功率平衡、储能容量、网络潮流等)以及高效求解算法的应用,具备较强的理论深度与工程实践价值。; 适合人群:具备电力系统、能源互联网、优化理论或智能调度相关基础知识,从事微电网运行、共享储能配置、算力与能源协同管理等领域研究的研究生、科研人员及工程技术开发者。; 使用场景及目标:①应用于含有动态算力负荷的多微电网系统协同调度优化决策;②为共享储能资源的规划配置、运行策略制定及商业模式设计提供量化分析工具;③推动“东数西算”背景下能源与算力基础设施的深度融合与协同发展。; 阅读建议:建议结合Matlab代码实现部分进行动手仿真实验,重点关注算力负荷时空特性建模方法与优化模型求解过程的实现细节,推荐使用实际历史数据或典型场景进行验证,并尝试拓展至更复杂的网络结构或多目标权衡分析。
内容概要:本文围绕考虑能量-物流耦合的港口综合能源系统优化调度问题展开研究,构建了涵盖电能、氢能、热能等多种能源形式与港口货物装卸、运输等物流活动协同优化的数学模型。研究采用Matlab进行代码实现,充分考虑风能等可再生能源出力的不确定性及时序性作业特征,提出一种能够有效降低系统运行成本、提升能源综合利用效率并减少碳排放的优化调度策略。文中系统阐述了目标函数设计、多类型约束建模及高效求解算法的选择过程,并通过具体仿真案例验证了所提模型与方法在调度效果和鲁棒性方面的优越性。; 适合人群:具备电力系统、综合能源系统或运筹优化等相关背景,熟悉Matlab编程,从事能源系统规划、运行优化等领域科研与工程应用的人员,尤其适合研究生、高校研究人员及能源行业工程师。; 使用场景及目标:①用于港口综合能源系统的规划设计与运行管理决策,提升多能协同效率;②为含多能互补与物流耦合特性的复杂能源系统提供建模思路与求解技术支持;③支撑科研论文复现、学术研究深化及实际工程项目的方案论证与优化。; 阅读建议:建议读者结合Matlab代码与理论内容同步学习,重点理解能量-物流耦合机制的数学表征、多目标优化的处理技巧以及约束条件的精细化建模方法,宜在掌握基本优化理论的基础上开展仿真调试与结果分析。
内容概要:本文系统介绍了名为《【复现】考虑数据中心共享储能与计算负荷时空迁移特性的虚拟电厂优化运行方法(Matlab代码实现)》的技术资源,聚焦于融合数据中心算力负荷调度与电力系统储能协同管理的虚拟电厂优化运行模型。该方法充分考虑了计算负荷在时间和空间上的可迁移特性,结合共享储能机制,构建了提升能源利用效率与系统经济性的综合优化框架,适用于“算力-电力”深度耦合的新型电力系统研究。文中不仅提供了完整的Matlab仿真代码、数学模型及配套论文资料,还强调科研需具备缜密逻辑、善用资源,并倡导在扎实基础上进行创新思考,以实现科研突破。; 适合人群:具备电力系统、能源互联网、优化调度等相关领域基础知识的研究生、科研人员及工程技术人员,特别适合从事虚拟电厂、数据中心能源管理、共享储能、综合能源系统等方向研究的专业人士。; 使用场景及目标:①用于复现和深入理解计及算力负荷时空迁移特性的虚拟电厂优化模型;②支撑高水平科研论文撰写、科研课题攻关或学位论文的仿真验证工作;③掌握利用Matlab进行复杂能源系统建模、优化求解与仿真实践的关键技能。; 阅读建议:建议读者严格按照资料目录顺序系统学习,同步下载并运行网盘中的完整资源(代码、模型、论文),重点关注其优化建模的理论推导与代码实现细节,坚持理论分析与仿真实验相结合,以深刻把握“算力-电力”协同优化的核心机制与技术精髓。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值