AndroidAnnotations注解框架

转自:https://www.cnblogs.com/jack-1900/p/3883718.html


AndroidAnnotations是一个开源框架,旨在加快Android开发的效率。通过使用它开放出来的注解api,你几乎可以使用在任何地方, 大大的减少了无关痛痒的代码量,让开发者能够抽身其外,有足够的时间精力关注在真正的业务逻辑上面。而且通过简洁你的代码,也提高了代码的稳定性和后期的维护成本。以下AndroidAnnotations简称为AA

可能会有人提出异议了,我们移动设备的性能,不比后台服务器拥有充足的内存和运算能力。当大量的使用注解的时候,会不会对APP的造成什么不良的影响,会不会影响到APP的执行性能?在这里先明确的声明,AA不会给APP带来任何副作用,相反它强大易用的api能为你带来前所未有的编程体验。

目前主流的注解框架有xUtils、ButterKnife、Dragger和Roboguice,它们的实现原理都是一致的,都是通过反射机制实现的。通过在Runtime运行期去反射类中带有注解的Field和Method,然后再去执行注解相对应的逻辑代码。大家都知道反射机制是在APP的运行期执行的,会造成执行的效率下降,执行时间变长的缺点。当在我们APP中大量的使用基于反射的注解,会严重影响到性能。但是AA的实现的逻辑并不是基于此。

AA工作的原理其实也很简单,它通过使用jdk 1.6引入的Java Annotation Processing Tool,

在编译器中加了一层额外的自动编译步骤,用来生成基于你源码的代码。生成的代码是你源码的直接子类,而且自动生成的类的名称就是父类名称后面加个下划线。比如使用了@EActivity注解的MyActivity,AA都会自动帮你生成一个名为MyActivity_的类。使用AA的注解在编译期间就已经自动生成了对应的子类,运行期运行的其实就是这个子类,所以说AA的使用不会给APP的执行性能造成负面影响。

AA开发环境搭建:右键=>Properties=>Java Compiler => Annotation Processing => Factory Path。

下面我们通过示例来简单了解这个强大的框架,主要介绍一些常用的注解。

一、组件的注解

image

@EActivity这个注解是用来修饰Activity的,向Activity注入布局,也可以设置页面的样式为全屏、无Title。这些使用具有实意的注解来实现,是不是很方便呀。对于其他的组件支持也是相当简单的,如@EService、@EReceiver、@EProvider、@EApplication、@EApplication、@EFragment。同时也能修饰自定义控件,注解为@EView、@EViewGroup。支持是不是相当全面。

二、资源引用的注解

image

有了AA,各种让人烦躁的findViewById从此一去不再返了,你可以简单的使用@ViewById去绑定布局里面的控件,如果你的变量名和控件的id值一致,连id的指向也可省去。而且在注解中不写id的情况下,如果编译器在R文件中找不到对应变量id名的时候,编译器也会给你提示,很是友好。

同时你要是想在成员变量中引用资源的话,只要在变量上加入对应的注解修饰就可以了,同样的如果变量名称和资源id一致的时候,id就可省去。支持所有的资源文件,所有的。

如果你想获取系统服务,只要在你的变量前加上@SystemService注解。

获取Intent中传递的值,加上@Extra注解,同时容错性很好,如果接收不到这个key对应的value,也没问题,你可以设置默认值。再有就是强转失败也不会造成crash,比如传递的是个int值,接收的时候是个String,也没有问题,只是接收失败罢了。

很强大有木有,修饰成员变量的注解主要用来解决它们初始化的问题,做到声明即初始化,拿来即可用的功能。还有很多属性,就不一一介绍了。

三、事件绑定注解

image

AA支持基本所有的原生事件的绑定,示例中展示的是常见的三种。简单的一个事件注解加上一个监听的控件id,就能完成以前要做的复杂的事件绑定呀,内部类实现呀等。而且方法名可以任意定制,如果方法名与控件的id一致,注解中的id也可省去,同样如果匹配不上的话,编译器也编译不过的。方法的参数列表也是可以自定义的,当需要参数的时候,就把原生监听方法的参数列表拉过来就可以直接使用了。其他常用的还有@TextChange、@ItemClick、@SeekBarProgressChange。

四、异步线程与UI线程的交互

image

当View相关的成员变量初始化完毕后,会调用拥有@AfterViews注解的方法,你可以在里面初始化一些界面控件等。如果其他的成员变量处事完毕,就会调用@AfterInject。

比如大多数应用的逻辑是这样的,初始化界面之后,就发起耗时的数据请求,然后解析获取到的数据,再设置到界面上。一般的涉及UI线程与异步任务交互的时候,相对都比较麻烦一些。让我们看下AA是如何实现的。

image

很简单吧,UI线程执行的方法加个@UiThread,异步线程方法加个@Background,两者的交互就是方法直接的相互调用,其他的你不用关心,一切的实现都是AA的编译器去自动生成交互的代码。交互的过程,完全没有在执行异步的感觉,不用再使用Handler去发送接收Message了。两个注解就把以前一堆的代码实现的功能给实现了,真心给个最大的赞。

五、Rest API

在AA中也支持Rest API,而且支持所有的HTTP请求方法。下面演示的是一个GET请求。

image
image

定义一个请求的接口,然后就可以直接使用了,不需要自己再去实现。这个跟公司后台接口设计紧密相关,如果你公司接口交互都是Rest风格的话,你就重写下,好好体验AA的魅力吧。

写在最后:AndroidAnnotations功能强大,是注解框架中当之无愧的王者,灵活的API大大的提高了开发的效率,降低维护的成本。如果说它有什么弊端,我只能说NO,它没有弊端。如果硬要来一个的话,也只能是它的注解比较多,熟悉需要一段时间,如果整个开发团队技术迁移过来的话,前期技术成本稍高。但是所谓砍柴不误磨刀功,还是不能归结为一个弊端。AA还有很多强大实用的功能,限于篇幅就不展开说了,自己去探索吧。

好了,今天的干货都到此为止。

AA 地址 : https://github.com/excilys/androidannotations

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,344评论 0 17
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,081评论 1 32
  • 我以为是微风 吹散整日的愁云 我以为是阳光 洒落一地的斑驳 我以为是细雨 滋润一夏的干涸 我以为是白云 是星星 是...
    南方姑娘思小鱼阅读 317评论 2 8
  • Build: Pull: Run: Push: 镜像导出和导入 容器导出和导入
    taojy123阅读 257评论 0 0
  • 玩游戏无意义,做家务无意义,出去无意义,生活不是加法就是减法,最后结果可能还是零
    圆觉经阅读 95评论 0 0