背景
針對android移動開發(fā),在起初使用Eclipse開發(fā)的時候初始化view常用的是findviewById,因為對于頁面復雜的情況,經(jīng)常會看到一個java文件中會有很多行findviewById,設(shè)置點擊事件也需要十幾二十行的代碼,對于程序員來講,寫的有點枯燥乏味還浪費時間;如圖1,2
轉(zhuǎn)到AS開發(fā)之后想必很多人會棄用findviewById改用ButterKnife。
正確使用ButterKnife步驟
1. 先下載ButterKnifeZelezng插件(AndroidStudio->File->Settings->Plugins->ButterKnifeZelezng),在模塊的build.gradle文件中添加依賴,同步更新一下,引入butterknife庫。
2. 在Activity頁面oncreate()中初始化(ButterKnife.bind(this)),在頁面中選中l(wèi)ayout布局文件右鍵等操作之后基本上就可以省去寫很多行的findviewById的時間,同時可以設(shè)置點擊事件,重新命名等操作;
?next
以上就是完整的使用butterknife的全部過程,是不是很簡單,相信你學會使用butterknife注入來完成view初始化,再也不想使用手動機械性的findviewById初始化了,真的是太浪費時間。
也支持Fragment、ViewHolder注入(因為ButterKnife認為這些類的包名以 com.android 開頭的類是沒有注解功能),只需要更改butterknife初始化方法即可:ButterKnife.bind(object, view);
對ButterKnife的解讀:
原始的注解庫的實現(xiàn)方法是:通過反射獲取到View,并復制給Activity中的某一屬性,但是Activity運行時大量使用反射會影響App的運行性能,造成卡頓現(xiàn)象或者是生成很多臨時java對象更容易觸發(fā)GC。
而ButterKnife采用了Java Annotation Processing技術(shù),就是在Java代碼編譯成Java字節(jié)碼的時候就已經(jīng)處理了 @Bind 、 @OnClick 等這些注解了。
Java Annotation Processing技術(shù)是什么?
APT(Annotation processing tool)是在編譯時,掃描和處理注解的一個構(gòu)建工具,可以在編譯源代碼時額外生成 Java 源代碼。Annotation processing 是javac中用于編譯時掃描和解析Java注解的工具。
.gradle中添加依賴:apt'com.jakewharton:butterknife-compiler:8.0.1'
ButterKnife 工作流程
當你編譯你的Android工程時,ButterKnife工程中 ButterKnifeProcessor 類的 process() 方法會執(zhí)行以下操作:
* 程序開始它會掃描Java代碼中所有的ButterKnife注解 @Bind 、 @OnClick ?等;
* 當它發(fā)現(xiàn)一個類中含有任何一個注解時, ButterKnifeProcessor 會幫你生成一個Java類,名字類似 $$ViewBinder ,這個新生成的類實現(xiàn)了 ViewBinder 接口;
* 這個 ViewBinder 類中包含了所有對應的代碼,比如 @Bind 注解對應 findViewById() , @OnClick 對應了 view.setOnClickListener() 等等;
* 最后當Activity啟動 ButterKnife.bind(this) 執(zhí)行時,ButterKnife會去加載對應的 ViewBinder 類調(diào)用它們的 bind() 方法。
ButterKnife.bind 執(zhí)行過程
最后,執(zhí)行 bind 方法時,我們會調(diào)用 ButterKnife.bind(this) ,源碼如下:
* ButterKnife會調(diào)用 findViewBinderForClass(targetClass) 找到注解處理器生成的輔助類加載 clsName$ViewBinder.java 類,findViewBinderForClass方法見圖9:
* 然后調(diào)用 ViewBinder 的 bind 方法,動態(tài)注入 clsActivity 類中所有的View屬性;
* 如果Activity中有 @OnClick 注解的方法,ButterKnife會在 ViewBinder 類中給View設(shè)置onClickListener,并且將 @OnClick 注解的方法傳入其中。
ButterKnife對Class.forName和viewBindingClass.newInstance這兩個方法進行了一些優(yōu)化,使用靜態(tài)Map進行緩存( 解析每個被注解的元素之后會得到一個 Map targetClassMap,接著就會調(diào)用 Map 中每個 bindingClass 生成 Java 源代碼),但是第一次查找的時候的性能影響是免不了的。
第一次寫文章 ?需要學習的東西還有很多,我會慢慢改進的
參照:http://www.tuicool.com/articles/QB73eyf