ButterKnife的使用詳解

背景

針對android移動開發(fā),在起初使用Eclipse開發(fā)的時候初始化view常用的是findviewById,因為對于頁面復雜的情況,經(jīng)常會看到一個java文件中會有很多行findviewById,設(shè)置點擊事件也需要十幾二十行的代碼,對于程序員來講,寫的有點枯燥乏味還浪費時間;如圖1,2

圖1
圖2

轉(zhuǎn)到AS開發(fā)之后想必很多人會棄用findviewById改用ButterKnife。

正確使用ButterKnife步驟


1. 先下載ButterKnifeZelezng插件(AndroidStudio->File->Settings->Plugins->ButterKnifeZelezng),在模塊的build.gradle文件中添加依賴,同步更新一下,引入butterknife庫。

圖3 build.gradule引入依賴

2. 在Activity頁面oncreate()中初始化(ButterKnife.bind(this)),在頁面中選中l(wèi)ayout布局文件右鍵等操作之后基本上就可以省去寫很多行的findviewById的時間,同時可以設(shè)置點擊事件,重新命名等操作;

圖4? ? ? Generate ButterKnife Injections 選項

?next

圖5? ? onclick為是否設(shè)置點擊事件;Variable Name為java文件中空間的名稱,可重新命名


圖6? ? butterknife自動初始化完成


圖7? ? 自動生成設(shè)置的onclick事件的回調(diào)方法

以上就是完整的使用butterknife的全部過程,是不是很簡單,相信你學會使用butterknife注入來完成view初始化,再也不想使用手動機械性的findviewById初始化了,真的是太浪費時間。

也支持Fragment、ViewHolder注入(因為ButterKnife認為這些類的包名以 com.android 開頭的類是沒有注解功能),只需要更改butterknife初始化方法即可:ButterKnife.bind(object, view);

對ButterKnife的解讀:

可參考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) ,源碼如下:


圖8 ?bind源碼

* ButterKnife會調(diào)用 findViewBinderForClass(targetClass) 找到注解處理器生成的輔助類加載 clsName$ViewBinder.java 類,findViewBinderForClass方法見圖9:


圖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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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