【IT168 評論】Android開發是當下最火的開發方向之一,但是在開發過程中我們會發現它有一個很大的弊端就是代碼重複很多,Android代碼需要和很多UI組件建立關係,後臺也需異步執行很多操作,所以很容易就導致了「義大利麵條」式代碼。為了解決以上問題,保持代碼的清晰和可讀性,今天我們為大家介紹六個Android庫。
Retrofit是Square公司開發的一款針對Android網絡請求的框架,Retrofit2底層基於OkHttp實現的,OkHttp現在已經得到Google官方認可,大量的app都採用OkHttp做網絡請求,其源碼詳見OkHttp Github。雖然它不是一個革命性的應用程式,它的功能很齊全,如執行網絡、圖像使用、創建組件列表、響應用戶輸入等等。
接下來,我們就把這些庫應用到代碼中,看看它們是如何幫助我們維護代碼乾淨簡潔的。
1.Butter Knife
每訪問一次視圖我們都需要獲取一次該視圖的對象實例,我們可以通過使用rootView.findViewById()方法將返回的對象轉換為正確的視圖類型。但是當代碼建立起來,之後你會發現這其中有很多相似的語句,尤其是在onCreate和onCreateView方法中。onCreate方法初始化所有,然後綁定偵聽器,它需要把整個UI都綁在一起,所以UI元素越多,方法就會越長。
我們簡單舉個例子,假設這個視圖需要三個視圖,兩個EditTexts和一個Button,一般來說,我們都是這樣做:
除了將它們存儲在活動的欄位中,可以從布局中查找視圖,添加了一個匿名的內部類作為偵聽器來處理搜索命令之外,代碼中沒有其它功能。這時,我們可以使用Butter Knife來簡化代碼,視圖對象存儲在欄位中,我們可以簡單地向每個欄位添加Butter Knife @BindView注釋,如下所示:
然後我們還需要使onCreateView方法知道Butter Knife的存在,只需要執行下方的初始化代碼即可:
之後,我們將監聽器綁定到searchButton方法,並改為註解onSearchButtonClicked方法,將它綁定到按鈕的點擊事件中@OnClick。
Buffer Knife主頁還有很多例子可供開發人員參考,一般來說,只要你需要以編程方式來訪問視圖元素,Butter Knife都會讓你的代碼變得簡潔可讀。
2.Ice Pick
很多Android應用程式都會面臨同一個問題,那就是活動和片段生命周期的不正確處理。我們都知道這是Android代碼中不優雅的部分,但是AndroidManifest文件中禁用橫向模式,當用戶將設備側向移動時,應用程式不會崩潰並非一個正確的解決方案:首先,因為它看起來有點蠢,其次,代碼不能正確處理的配置更改問題仍會發生。所以,最關鍵的就是你要正確處理應用程式組件的狀態和生命周期。
實現這一目標的方式是將活動中所有欄位的內容存儲到一個bundle中,然後由Android框架通過生命周期正確管理。
Ice Pick的出現簡化了這一過程,它主要用於簡化保存和恢復實例狀態的生命周期,我們不再需要一個一個的講所有變量保存到bundle中。下面進行一個實例示範,我們需要記住最後一家公司和存儲庫搜索的組合。
首先,我們註解要保存到bundle中的欄位:
@State String lastSearchCombination;
然後在onSaveInstanceState()方法中調用Ice Pick:
調用onCreateView()方法中的Ice Pick來恢復狀態:
需要注意的一點是保存到bundle中的限制仍然存在,所以無需再為bundle添加常量或為savedInstanceState添加空檢查。
3.Dart and Henson
Extra是Android標準的組件之間(Activity/Fragment/Service等)傳遞數據的方式。Dart通過註解處理器在編譯階段生成一些代碼,幫助我們避免寫入從一個活動傳遞到另一個活動的Intent Extras的所有鍵和檢查。它適用於Fragments。
接下來,會為大家講解一個小例子,如何使用@InjectExtra注釋將搜索關鍵字從搜索屏幕傳遞到貢獻者列表,實際上執行搜索的地方。
首先使用@InjectExtra註解定義兩個類變量:
@InjectExtra String repositoryQuery;
@InjectExtra String companyQuery;
Dart.inject(this,getActivity());被調用之後,所有的一切都會被自動初始化。現在需要考慮的是在Bundle中被添加到Intent的extras會如何?你可以手動進行,也可以選用Henson。接下來將下方代碼添加到SearchFragment:
這樣就簡化了代碼中活動之間的通信,無需每次都手動指定txtra。
4.Parceler
在安卓中要傳遞數據或者保存狀態,對象需要實現Serializable或者Parcelable。與傳統的Serializable相比,Parcelable被認為更快,因為它沒有反射的負擔(以及更少的內存),因此更適合移動app。
實現一個Parcelable需要做更多的工作。雖然Android Studio有一個自動生成代碼的工具,但是每次class改變的時候都要重複這一步。而Parceler恰好可以解決這個問題,它可以幫助你進行對象序列化,幫助你傳遞任何對象作為Intent extra。
Parceler使用了一個註解處理器,因此首先需要應用Android APT 插件,那樣你的IDE才能知道生成的類,而註解處理產生的代碼菜不會包含在apk中。另外,Icepick,Henson和Dart也能和諧地和Parceler一起玩。
5.Timber
Timber是一個小的可擴展的日誌工具。通常,我們在寫代碼的時候都會不可避免的出現一些錯誤,繼而導致應用程式意外宕掉。這時,我們需要重現它,才能解決問題。如果你清楚重現的步驟,那麼使用調試器就很方便,但是如果不清楚,也可以使用日誌。
Android提供的開箱即用的日誌類也可以提供不同的日誌記錄級別,使用也很方便,但是它有一個特點,就是每個Log.d()語句都需要兩個參數; 首先是tag,第二是message,而tag在99%的時間裡都是this.class.getName(),它要一次次的寫入。如果我們使用Timber庫就可以這樣做:
Timber.d("Informative output that needs to be logged.");
上面的語句可以自動匹配正確的默認標記。此外,在使用之前要初始化Timer:
Timber.plant(new Timber.DebugTree());
6.Dagger and Dagger 2
Dagger2是一個Java和Android的依賴注入框架,使用依賴注入有哪些好處呢?使用類和被依賴的對象構造分開,這樣如果我們需要改變被依賴類的構造方法,不必改動每一個使用類;對各種被依賴類的實例,可以只構造一次;當我們需要更換一種實現時,只需要保證接口一致;利於單元測試,我們可以方便地mock依賴類的對象。
Dagger 1是由Square公司受到Guice啟發創建的,可以說是Android上最流行的依賴注入框架,它在編譯的時候實行綁定,同時也用到了反射機制。Dagger2是Dagger1的分支,由谷歌公司接手開發,相較於Dagger1,性能更好,更易於跟蹤測試。