轉(zhuǎn)自:https://www.cnblogs.com/jack-1900/p/3883718.html
AndroidAnnotations是一個開源框架之剧,旨在加快Android開發(fā)的效率屏鳍。通過使用它開放出來的注解api,你幾乎可以使用在任何地方搂妻, 大大的減少了無關(guān)痛癢的代碼量,讓開發(fā)者能夠抽身其外,有足夠的時間精力關(guān)注在真正的業(yè)務(wù)邏輯上面揩瞪。而且通過簡潔你的代碼疹鳄,也提高了代碼的穩(wěn)定性和后期的維護成本拧略。以下AndroidAnnotations簡稱為AA
可能會有人提出異議了,我們移動設(shè)備的性能瘪弓,不比后臺服務(wù)器擁有充足的內(nèi)存和運算能力垫蛆。當大量的使用注解的時候,會不會對APP的造成什么不良的影響腺怯,會不會影響到APP的執(zhí)行性能袱饭?在這里先明確的聲明,AA不會給APP帶來任何副作用呛占,相反它強大易用的api能為你帶來前所未有的編程體驗虑乖。
目前主流的注解框架有xUtils、ButterKnife晾虑、Dragger和Roboguice疹味,它們的實現(xiàn)原理都是一致的,都是通過反射機制實現(xiàn)的帜篇。通過在Runtime運行期去反射類中帶有注解的Field和Method糙捺,然后再去執(zhí)行注解相對應(yīng)的邏輯代碼。大家都知道反射機制是在APP的運行期執(zhí)行的笙隙,會造成執(zhí)行的效率下降洪灯,執(zhí)行時間變長的缺點。當在我們APP中大量的使用基于反射的注解竟痰,會嚴重影響到性能签钩。但是AA的實現(xiàn)的邏輯并不是基于此。
AA工作的原理其實也很簡單凯亮,它通過使用jdk 1.6引入的Java Annotation Processing Tool边臼,
在編譯器中加了一層額外的自動編譯步驟,用來生成基于你源碼的代碼假消。生成的代碼是你源碼的直接子類柠并,而且自動生成的類的名稱就是父類名稱后面加個下劃線。比如使用了@EActivity注解的MyActivity,AA都會自動幫你生成一個名為MyActivity_的類臼予。使用AA的注解在編譯期間就已經(jīng)自動生成了對應(yīng)的子類鸣戴,運行期運行的其實就是這個子類,所以說AA的使用不會給APP的執(zhí)行性能造成負面影響粘拾。
AA開發(fā)環(huán)境搭建:右鍵=>Properties=>Java Compiler => Annotation Processing => Factory Path窄锅。
下面我們通過示例來簡單了解這個強大的框架,主要介紹一些常用的注解缰雇。
一入偷、組件的注解
@EActivity這個注解是用來修飾Activity的,向Activity注入布局械哟,也可以設(shè)置頁面的樣式為全屏疏之、無Title。這些使用具有實意的注解來實現(xiàn)暇咆,是不是很方便呀锋爪。對于其他的組件支持也是相當簡單的,如@EService爸业、@EReceiver其骄、@EProvider、@EApplication扯旷、@EApplication拯爽、@EFragment。同時也能修飾自定義控件薄霜,注解為@EView某抓、@EViewGroup。支持是不是相當全面惰瓜。
二、資源引用的注解
有了AA汉矿,各種讓人煩躁的findViewById從此一去不再返了崎坊,你可以簡單的使用@ViewById去綁定布局里面的控件,如果你的變量名和控件的id值一致洲拇,連id的指向也可省去奈揍。而且在注解中不寫id的情況下,如果編譯器在R文件中找不到對應(yīng)變量id名的時候赋续,編譯器也會給你提示男翰,很是友好。
同時你要是想在成員變量中引用資源的話纽乱,只要在變量上加入對應(yīng)的注解修飾就可以了蛾绎,同樣的如果變量名稱和資源id一致的時候,id就可省去。支持所有的資源文件租冠,所有的鹏倘。
如果你想獲取系統(tǒng)服務(wù),只要在你的變量前加上@SystemService注解顽爹。
獲取Intent中傳遞的值纤泵,加上@Extra注解,同時容錯性很好镜粤,如果接收不到這個key對應(yīng)的value捏题,也沒問題,你可以設(shè)置默認值肉渴。再有就是強轉(zhuǎn)失敗也不會造成crash涉馅,比如傳遞的是個int值,接收的時候是個String黄虱,也沒有問題稚矿,只是接收失敗罷了。
很強大有木有捻浦,修飾成員變量的注解主要用來解決它們初始化的問題晤揣,做到聲明即初始化,拿來即可用的功能朱灿。還有很多屬性昧识,就不一一介紹了。
三盗扒、事件綁定注解
AA支持基本所有的原生事件的綁定跪楞,示例中展示的是常見的三種。簡單的一個事件注解加上一個監(jiān)聽的控件id侣灶,就能完成以前要做的復(fù)雜的事件綁定呀甸祭,內(nèi)部類實現(xiàn)呀等。而且方法名可以任意定制褥影,如果方法名與控件的id一致池户,注解中的id也可省去,同樣如果匹配不上的話凡怎,編譯器也編譯不過的校焦。方法的參數(shù)列表也是可以自定義的,當需要參數(shù)的時候统倒,就把原生監(jiān)聽方法的參數(shù)列表拉過來就可以直接使用了寨典。其他常用的還有@TextChange、@ItemClick房匆、@SeekBarProgressChange耸成。
四报亩、異步線程與UI線程的交互
當View相關(guān)的成員變量初始化完畢后,會調(diào)用擁有@AfterViews注解的方法墓猎,你可以在里面初始化一些界面控件等捆昏。如果其他的成員變量處事完畢,就會調(diào)用@AfterInject毙沾。
比如大多數(shù)應(yīng)用的邏輯是這樣的骗卜,初始化界面之后,就發(fā)起耗時的數(shù)據(jù)請求左胞,然后解析獲取到的數(shù)據(jù)寇仓,再設(shè)置到界面上。一般的涉及UI線程與異步任務(wù)交互的時候烤宙,相對都比較麻煩一些遍烦。讓我們看下AA是如何實現(xiàn)的。
很簡單吧躺枕,UI線程執(zhí)行的方法加個@UiThread服猪,異步線程方法加個@Background,兩者的交互就是方法直接的相互調(diào)用拐云,其他的你不用關(guān)心罢猪,一切的實現(xiàn)都是AA的編譯器去自動生成交互的代碼。交互的過程叉瘩,完全沒有在執(zhí)行異步的感覺膳帕,不用再使用Handler去發(fā)送接收Message了。兩個注解就把以前一堆的代碼實現(xiàn)的功能給實現(xiàn)了薇缅,真心給個最大的贊危彩。
五、Rest API
在AA中也支持Rest API泳桦,而且支持所有的HTTP請求方法汤徽。下面演示的是一個GET請求。
定義一個請求的接口蓬痒,然后就可以直接使用了泻骤,不需要自己再去實現(xiàn)。這個跟公司后臺接口設(shè)計緊密相關(guān)梧奢,如果你公司接口交互都是Rest風格的話,你就重寫下演痒,好好體驗AA的魅力吧亲轨。
寫在最后:AndroidAnnotations功能強大,是注解框架中當之無愧的王者鸟顺,靈活的API大大的提高了開發(fā)的效率惦蚊,降低維護的成本器虾。如果說它有什么弊端,我只能說NO蹦锋,它沒有弊端兆沙。如果硬要來一個的話,也只能是它的注解比較多莉掂,熟悉需要一段時間葛圃,如果整個開發(fā)團隊技術(shù)遷移過來的話,前期技術(shù)成本稍高憎妙。但是所謂砍柴不誤磨刀功库正,還是不能歸結(jié)為一個弊端。AA還有很多強大實用的功能厘唾,限于篇幅就不展開說了褥符,自己去探索吧。
好了抚垃,今天的干貨都到此為止喷楣。