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

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

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

AA工作的原理事实上也非常easy,它通过使用jdk 1.6引入的Java Annotation Processing Tool,

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

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

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

一、组件的注解

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

二、资源引用的注解

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

同一时候你要是想在成员变量中引用资源的话,仅仅要在变量上增加相应的注解修饰就能够了,相同的假设变量名称和资源id一致的时候,id就可省去。支持全部的资源文件,全部的。

假设你想获取系统服务,仅仅要在你的变量前加上@SystemService注解。

获取Intent中传递的值,加上@Extra注解,同一时候容错性非常好,假设接收不到这个key相应的value,也没问题,你能够设置默认值。再有就是强转失败也不会造成crash,比方传递的是个int值,接收的时候是个String,也没有问题,仅仅是接收失败罢了。

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

三、事件绑定注解



AA支持基本全部的原生事件的绑定,演示样例中展示的是常见的三种。简单的一个事件注解加上一个监听的控件id,就能完毕曾经要做的复杂的事件绑定呀,内部类实现呀等。并且方法名能够随意定制,假设方法名与控件的id一致,注解中的id也可省去,相同假设匹配不上的话,编译器也编译只是的。方法的參数列表也是能够自己定义的,当须要參数的时候,就把原生监听方法的參数列表拉过来就能够直接使用了。其它经常使用的还有@TextChange、@ItemClick、@SeekBarProgressChange。

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



当View相关的成员变量初始化完成后,会调用拥有@AfterViews注解的方法,你能够在里面初始化一些界面控件等。假设其它的成员变量处事完成,就会调用@AfterInject。

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

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

五、Rest API

在AA中也支持Rest API,并且支持全部的HTTP请求方法。以下演示的是一个GET请求。

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

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

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

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

假设认为对你有所帮助,欢迎大家订阅我的微信公众账号——Android干货分享(ID:android_share)。以下是微信的二维码,为你提供及时高质的Android干货。技术交流QQ群:318588906,欢迎大家加群,共同探讨下Android和Java技术,一起壮大我们的微信干货分享社区。

注解框架---AndroidAnnotations的更多相关文章

  1. Android注解框架实战-ButterKnife

    文章大纲 Android注解框架介绍 ButterKnife实战 项目源码下载   一.框架介绍 为什么要用注解框架?  在Android开发过程中,我们经常性地需要操作组件,操作方法有findVie ...

  2. Android 注解框架对比

    Java的注解(Annotation)相当于一种标记,在程序中加入注解就等于为程序打上某种标记,标记可以加在包,类,属性,方法,本地变量上.然后你可以写一个注解处理器去解析处理这些注解(人称编译时注解 ...

  3. java注解框架

    我们经常会在java代码里面看到:“@Override”,“@Target”等等样子的东西,这些是什么? 在java里面它们是“注解”. 下面是百度百科的解释:java.lang.annotation ...

  4. ButterKnife注解框架详解

    Android 懒人注解框架 :https://github.com/JakeWharton/butterknife 前言: 注解,相信很多同学都用到了,对控件进行初始化的时候需要用到 findVie ...

  5. 自己来实现一套IOC注解框架

    我们自己来实现一套IOC注解框架吧,采用的方式反射加注解和Xutils类似,但我们尽量不写那么麻烦,也不打算采用动态代理,我们扩展一个检测网络的注解,比如没网的时候我们不去执行方法而是给予没有网络的提 ...

  6. 开发自己的山寨Android注解框架

    目录 开发自己的山寨Android注解框架 开发自己的山寨Android注解框架 参考 Github黄油刀 Overview 在上一章我们学习了Java的注解(Annotation),但是我想大家可能 ...

  7. Android ButterKnife注解框架使用

    这段时间学习了下ButterKnife注解框架,学习的不是特别深入,但是基础也差不多了,在此记录总结一下. ButterKnife是一个Android View注入的库,主要是注解的使用,可以减少很多 ...

  8. java 编译时注解框架 lombok-ex

    lombok-ex lombok-ex 是一款类似于 lombok 的编译时注解框架. 编译时注,拥有运行时注解的便利性,和无任何损失的性能. 主要补充一些 lombok 没有实现,且自己会用到的常见 ...

  9. Android配置AndroidAnnotations注解框架配置

    1在新建的普通项目里面,新建一个compile-libs文件夹,将下载来的androidannotation-xx.jar添加到compile-libs文件夹下,将androidannotation- ...

随机推荐

  1. 再造 “手机QQ” 侧滑菜单(三)——视图联动

    代码示例:https://github.com/johnlui/SwiftSideslipLikeQQ 本 文中,我们将一起使用 UINavigationController 来管理主视图,并实现点击 ...

  2. POJ1700(过河问题)

    #include<iostream> #include<algorithm> using namespace std; ]; int main() { int t,i; cin ...

  3. UVa 10330 Power Transmission / 最大流

    最大流 这题有很多起点和终点 在取2个点(0和n+1) 作为唯一的起点和终点 此外每个点也有容量限制 建图时每条边上的容量为这条边和2个端的容量的最小值 然后EK就行 #include <cst ...

  4. JSP两个动作(include,forward)

    include动作 <div id="container"> <jsp:include page="HelloWorld.jsp" flush ...

  5. Android:创建文件或文件夹以及获取sd卡根目录

    目录结构: 功能,可以根据录入的目录或者文件夹生成相应的文件或者文件夹 首先需要添加一个权限: <uses-permission android:name="android.permi ...

  6. Jquery学习笔记:利用parent和parents方法获取父节点

    通过选择器一般只能获取指定标识的节点,或者获取子节点. 有些场景下,往往需要根据当前节点找到满足条件的父节点.这个可以通过相应的方法来实现. 1.parent方法 该方法可以获取元素的直接父节点. 我 ...

  7. MinGW介绍与使用

    3.1:MinGW 是什么? MinGW 提供了一套简单方便的Windows下的基于GCC 程序开发环境.MinGW 收集了一系列免费的Windows 使用的头文件和库文件:同时整合了GNU ( ht ...

  8. vi/vim高级命令集粹

    vi/vim高级命令集粹 (ctrl +v过来 留着以后看) 1.交换两个字符位置 xp 2.上下两行调换 ddp 3.把文件内容反转 :g/^/m0/ (未通过) 4.上下两行合并 J 5.删除所有 ...

  9. B树的实现与源代码二(删除源代码)

    int BTreeMaximum( BNode *x ) { if ( x->leaf ) { return x->key[x->size - 1]; } else { return ...

  10. Swift - 给图片添加图片水印(图片上绘制另一张图,并可设透明度)

    我前面写了篇文章讲解如何给图片添加文字水印,而如果想要添加图片类型的水印也很简单,只要把原来代码里添加文字的部分改成图片即可. 1,效果图如下: (在图片左上角添加了一个半透明的logo图片) 2,为 ...