怎样用 Android Annotations 写出高性能代码

简介: 上一篇博文中简单介绍了 Android Annotations 的基本用法,顺便扯了一下概念 - 契约编程,阅读量少的可怜,看来并没有多少人对此感兴趣,今天再来一篇,介绍几个稍微高级点的用法,我就不信弄不出一个大新闻。 本篇将要介绍的几个也许并不常用,但是逼格是有保证的,它们是 Thread A

上一篇博文中简单介绍了 Android Annotations 的基本用法,顺便扯了一下概念 - 契约编程,阅读量少的可怜,看来并没有多少人对此感兴趣,今天再来一篇,介绍几个稍微高级点的用法,我就不信弄不出一个大新闻。

本篇将要介绍的几个也许并不常用,但是逼格是有保证的,它们是

  • Thread Annotations
  • CheckResult Annotations
  • CallSuper Annotations
  • Enumerated Annotations

Thread Annotations

Thread Annotations 有四位成员 - @UiThread@MainThread@WorkerThread@BinderThread,它们来自不同的 java 文件,却拥有着共同的 target,不信你看:

@Retention(CLASS)
@Target({METHOD,CONSTRUCTOR,TYPE})

 
 
  • 1
  • 2
AI 代码解读

如果标记 class,那么这个 class 的所有方法都必须在指定线程上执行,例如

@UiThread
public class NavigationBar {
  @NonNull
  private NavigationBar addEntry(
    @StringRes int iconFontRes, 
    @NonNull String title,
    @NonNull OnClickListener listener) {
    // ...
  }
  // ...
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
AI 代码解读

这样一来,NavigationBar 的所有方法都要运行在 Ui Thread,否则 Android Studio 会!报!错!

@MainThread 与 @UiThread 的区别比较微妙,首先放放链接 - Support Annotations。总结起来一句话:@MainThread 用于标记与生命周期相关的方法,@UiThread 用于 View Hierarchy,但是 Android Studio 认为两者是可以互换的,所以有这两种标记的方法可以互相调用。

然后我再稍微补充几句:

一个进程有且只有一个主线程 - @MainThread,同时它也是一个 @UiThread。例如,activity 的 main window 就运行在 @MainThread 上,但是系统也允许应用创建其他的线程以运行不同的 window(除了系统进程会这么干,几乎没有其他场景)

@CheckResult

这个 Annotation 对于【只看方法名无法判断是否有返回值】的方法特别管用,例如:

public boolean openUp()

 
 
  • 1
AI 代码解读

只看方法名openUp,可能不会多想,调用一下就完事了,也不会判断返回值。 
但是如果必须要判断 openUp 的返回值,除了文档约束好像也没有其他办法,有了 @CheckResults,一切都变得简单明了。

check result

@CallSuper

如果你提供了 api 给别人用,但是这个 api 必须要先调用父类方法才能正确执行,怎么办?让 @CallSuper 来拯救你。

CallSuper

Enumerated Annotations

编写高性能代码,从不用 enum 开始!

每一个 enum 都是一个对象,无论从内存还是从性能上来看,都没有一个 primitive type 的变量效率高。

例如,定义一个类 - ActionBar,用户可以通过 setMode 设置不同的模式,如果使用 enum,可能会写成下面这样:

public class ActionBar {
    public enum Theme {
        DARK, LIGHT
    }
    private Theme mTheme;
    public void setTheme(Theme theme) {
        mTheme = theme;
    }
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
AI 代码解读

为了提升代码效率,可以用两个整形变量来替代 Theme,但是这样无法保证参数 theme 的合法性,用户可能传入了 DARK 和 LIGHT 之外的值。

public class ActionBar {
    public static final int DARK = 0x00;
    public static final int LIGHT = 0x01;

    private int mTheme;

    public void setTheme(int theme) {
        mTheme = theme;
    }
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
AI 代码解读

如何既能提升效率又可以保证传入参数的合法性呢? 
用 @IntDef 来添加一个约束就搞定了。

public class ActionBar {

    @IntDef({DARK, LIGHT})
    @Retention(RetentionPolicy.SOURCE)
    public @interface Theme {}

    public static final int DARK = 0x00;
    public static final int LIGHT = 0x01;

    private int mTheme;

    public void setTheme(@Theme int theme) {
        mTheme = theme;
    }

    @Theme
    public int getTheme() {
        return mTheme;
    }
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
AI 代码解读

如果用户调用 setTheme 时传入了非法参数,Android Studio 会!报!错!

IntDef

如果我们打算把 DARK 和 LIGHT 作为一个 flag,允许用户通过逻辑运算去自由组合,也就说可以这样调用 setTheme

setTheme(DARK | LIGHT);
setTheme(DARK & LIGHT);

 
 
  • 1
  • 2
AI 代码解读

只需要把 @IntDef 的 flag 属性设为 true 即可。

public class ActionBar {

    @IntDef(flag = true, value = {DARK, LIGHT})
    @Retention(RetentionPolicy.SOURCE)
    public @interface Theme {}

    public static final int DARK = 0x00;
    public static final int LIGHT = 0x01;

    private int mTheme;

    public void setTheme(@Theme int theme) {
        mTheme = theme;
    }

    @Theme
    public int getTheme() {
        return mTheme;
    }
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
AI 代码解读

@StringDef 与 @IntDef 的原理一样,只不过用到的常量是 String 类型。

参考资料

转自: 一介码农
目录
打赏
0
0
0
0
22
分享
相关文章
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
61 1
探索安卓与iOS开发的差异:从代码到用户体验
【10月更文挑战第5天】在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。它们在技术架构、开发环境及用户体验上有着根本的不同。本文通过比较这两种平台的开发过程,揭示背后的设计理念和技术选择如何影响最终产品。我们将深入探讨各自平台的代码示例,理解开发者面临的挑战,以及这些差异如何塑造用户的日常体验。
🔥Android开发大神揭秘:从菜鸟到高手,你的代码为何总是慢人一步?💻
在Android开发中,每位开发者都渴望应用响应迅速、体验流畅。然而,代码执行缓慢却是常见问题。本文将跟随一位大神的脚步,剖析三大典型案例:主线程阻塞导致卡顿、内存泄漏引发性能下降及不合理布局引起的渲染问题,并提供优化方案。通过学习这些技巧,你将能够显著提升应用性能,从新手蜕变为高手。
59 2
Android调用Vue中的JavaScript代码
Android调用Vue中的JavaScript代码
93 3
Android项目架构设计问题之要提升代码的可读性和管理性如何解决
Android项目架构设计问题之要提升代码的可读性和管理性如何解决
53 0
Android远程连接和登录FTPS服务代码(commons.net库)
很多文章都介绍了FTPClient如何连接ftp服务器,但却很少有人说如何连接一台开了SSL认证的ftp服务器,现在代码来了。
134 2
🔥Android开发大神揭秘:从菜鸟到高手,你的代码为何总是慢人一步?💻
【7月更文挑战第28天】在Android开发中,每位开发者都追求极致的用户体验。然而,“代码执行慢”的问题时常困扰着开发者。通过案例分析,我们可探索从新手到高手的成长路径。
53 3
Android 监听Notification 被清除实例代码
Android 监听Notification 被清除实例代码
Android端使用WebView注入一段js代码实现js调用android
Android端使用WebView注入一段js代码实现js调用android
182 0
Android 进阶——代码插桩必知必会&ASM7字节码操作
Android 进阶——代码插桩必知必会&ASM7字节码操作
399 0

热门文章

最新文章

  • 1
    如何修复 Android 和 Windows 不支持视频编解码器的问题?
    56
  • 2
    Android历史版本与APK文件结构
    121
  • 3
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    38
  • 4
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
    22
  • 5
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
    5
  • 6
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
    11
  • 7
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    10
  • 8
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    34
  • 9
    Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
    1
  • 10
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    29
  • 1
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    13
  • 2
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    27
  • 3
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    34
  • 4
    Android历史版本与APK文件结构
    121
  • 5
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    29
  • 6
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    23
  • 7
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
    60
  • 8
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    37
  • 9
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
    73
  • 10
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    121
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等