AndroidAnnotations注解框架

轉(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窄锅。

下面我們通過示例來簡單了解這個強大的框架,主要介紹一些常用的注解缰雇。

一入偷、組件的注解

image

@EActivity這個注解是用來修飾Activity的,向Activity注入布局械哟,也可以設(shè)置頁面的樣式為全屏疏之、無Title。這些使用具有實意的注解來實現(xiàn)暇咆,是不是很方便呀锋爪。對于其他的組件支持也是相當簡單的,如@EService爸业、@EReceiver其骄、@EProvider、@EApplication扯旷、@EApplication拯爽、@EFragment。同時也能修飾自定義控件薄霜,注解為@EView某抓、@EViewGroup。支持是不是相當全面惰瓜。

二、資源引用的注解

image

有了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黄虱,也沒有問題稚矿,只是接收失敗罷了。

很強大有木有捻浦,修飾成員變量的注解主要用來解決它們初始化的問題晤揣,做到聲明即初始化,拿來即可用的功能朱灿。還有很多屬性昧识,就不一一介紹了。

三盗扒、事件綁定注解

image

AA支持基本所有的原生事件的綁定跪楞,示例中展示的是常見的三種。簡單的一個事件注解加上一個監(jiān)聽的控件id侣灶,就能完成以前要做的復(fù)雜的事件綁定呀甸祭,內(nèi)部類實現(xiàn)呀等。而且方法名可以任意定制褥影,如果方法名與控件的id一致池户,注解中的id也可省去,同樣如果匹配不上的話凡怎,編譯器也編譯不過的校焦。方法的參數(shù)列表也是可以自定義的,當需要參數(shù)的時候统倒,就把原生監(jiān)聽方法的參數(shù)列表拉過來就可以直接使用了寨典。其他常用的還有@TextChange、@ItemClick房匆、@SeekBarProgressChange耸成。

四报亩、異步線程與UI線程的交互

image

當View相關(guān)的成員變量初始化完畢后,會調(diào)用擁有@AfterViews注解的方法墓猎,你可以在里面初始化一些界面控件等捆昏。如果其他的成員變量處事完畢,就會調(diào)用@AfterInject毙沾。

比如大多數(shù)應(yīng)用的邏輯是這樣的骗卜,初始化界面之后,就發(fā)起耗時的數(shù)據(jù)請求左胞,然后解析獲取到的數(shù)據(jù)寇仓,再設(shè)置到界面上。一般的涉及UI線程與異步任務(wù)交互的時候烤宙,相對都比較麻煩一些遍烦。讓我們看下AA是如何實現(xiàn)的。

image

很簡單吧躺枕,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請求。

image
image

定義一個請求的接口蓬痒,然后就可以直接使用了泻骤,不需要自己再去實現(xiàn)。這個跟公司后臺接口設(shè)計緊密相關(guān)梧奢,如果你公司接口交互都是Rest風格的話,你就重寫下演痒,好好體驗AA的魅力吧亲轨。

寫在最后:AndroidAnnotations功能強大,是注解框架中當之無愧的王者鸟顺,靈活的API大大的提高了開發(fā)的效率惦蚊,降低維護的成本器虾。如果說它有什么弊端,我只能說NO蹦锋,它沒有弊端兆沙。如果硬要來一個的話,也只能是它的注解比較多莉掂,熟悉需要一段時間葛圃,如果整個開發(fā)團隊技術(shù)遷移過來的話,前期技術(shù)成本稍高憎妙。但是所謂砍柴不誤磨刀功库正,還是不能歸結(jié)為一個弊端。AA還有很多強大實用的功能厘唾,限于篇幅就不展開說了褥符,自己去探索吧。

好了抚垃,今天的干貨都到此為止喷楣。

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鹤树,隨后出現(xiàn)的幾起案子铣焊,更是在濱河造成了極大的恐慌,老刑警劉巖魂迄,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粗截,死亡現(xiàn)場離奇詭異,居然都是意外死亡捣炬,警方通過查閱死者的電腦和手機熊昌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來湿酸,“玉大人婿屹,你說我怎么就攤上這事⊥评#” “怎么了昂利?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長铁坎。 經(jīng)常有香客問我蜂奸,道長,這世上最難降的妖魔是什么硬萍? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任扩所,我火速辦了婚禮,結(jié)果婚禮上朴乖,老公的妹妹穿的比我還像新娘祖屏。我一直安慰自己助赞,他們只是感情好,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布袁勺。 她就那樣靜靜地躺著雹食,像睡著了一般。 火紅的嫁衣襯著肌膚如雪期丰。 梳的紋絲不亂的頭發(fā)上群叶,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機與錄音咐汞,去河邊找鬼盖呼。 笑死,一個胖子當著我的面吹牛化撕,可吹牛的內(nèi)容都是我干的几晤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼植阴,長吁一口氣:“原來是場噩夢啊……” “哼蟹瘾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起掠手,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤憾朴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后喷鸽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體众雷,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年做祝,在試婚紗的時候發(fā)現(xiàn)自己被綠了砾省。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡混槐,死狀恐怖编兄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情声登,我是刑警寧澤狠鸳,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站悯嗓,受9級特大地震影響件舵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜脯厨,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一芦圾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧俄认,春花似錦个少、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至岂贩,卻和暖如春茫经,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背萎津。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工卸伞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锉屈。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓荤傲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親颈渊。 傳聞我的和親對象是個殘疾皇子遂黍,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容

  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,426評論 0 17
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,104評論 1 32
  • 我以為是微風 吹散整日的愁云 我以為是陽光 灑落一地的斑駁 我以為是細雨 滋潤一夏的干涸 我以為是白云 是星星 是...
    南方姑娘思小魚閱讀 320評論 2 8
  • Build: Pull: Run: Push: 鏡像導出和導入 容器導出和導入
    taojy123閱讀 259評論 0 0
  • 玩游戲無意義俊嗽,做家務(wù)無意義雾家,出去無意義,生活不是加法就是減法绍豁,最后結(jié)果可能還是零
    圓覺經(jīng)閱讀 97評論 0 0