6個可以讓代碼變得更整潔的Android庫
來自:碼農網
鏈接:www.codeceo.com/article/6-android-lib-make-code-clean.html(點擊尾部閱讀原文前往)
英文原文:https://dzone.com/articles/android-libraries-that-can-clean-up-your-code
翻譯作者:碼農網 – 小峰
Android開發是有趣的——這毫無疑問。然而,還是有很多平台迫使我們編寫重複的樣板代碼。很多時候這都與需要你處理的UI組件相關。有一些確實是你需要的,當你希望你的應用程序架構能夠乾乾淨淨的時候。有很多操作在後台非同步執行;事實上,最後很容易成為一堆義大利麵條似的代碼,不可讀或者就是讓人感覺不正確。
今天,我們將看看6個可以幫助保持代碼清晰和可讀性的Android庫,並且使用示例項目以方便你可以看到庫的作用。
項目
我們將使用之前我們在Retrofit指南中使用過的Retrofit 2 Sample應用程序。這是一個簡單的開源項目,可以在GitHub上找到。它需要一個公司名稱和一個Git存儲倉庫,並列出所有的貢獻者,貢獻者顯示為帶有頭像的一個列表。雖然它不是一個革命性的app,但是它展示了如何執行網路,使用圖像,創建列表組件,以及處理用戶輸入。你可以隨意擺弄這個功能齊全的玩具項目。
讓我們將注釋庫應用到代碼,來看看它們如何幫助維護Android app代碼的整潔。
1.Butter Knife
每當你需要訪問代碼中的視圖時,你需要獲取該視圖的對象實例。你可以通過編寫rootView.findViewById()方法來實現,然後將返回的對象轉換為正確的視圖類型。但是,你的代碼很快就會建立起來,但是尤其是在onCreate和onCreateView方法中會有惱人的類似語句。想想看;在那些onCreate方法中,你初始化一切,綁定偵聽器,把整個UI綁在一起。你擁有的UI元素越多,那麼單個方法就會越長。
讓我們舉個簡單的例子:
此視圖將需要三個視圖:兩個EditTexts和一個Button,我們需要在片段中引用。一般我們會這樣做:
@OverridepublicViewonCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
// Inflate the layout for this fragmentView rootView = inflater.inflate(R.layout.fragment_search, container,false); companyEditText = (EditText) rootView.findViewById(R.id.company_edittext); repositoryEditText = (EditText) rootView.findViewById(R.id.repository_edittext); searchButton = (Button) rootView.findViewById(R.id.search_button); searchButton.setOnClickListener(newView.OnClickListener() {
@OverridepublicvoidonClick(View v){ searchContributors(); } });returnrootView;}
在代碼中除了從布局中查找視圖,將它們存儲在活動的欄位中,以及添加一個匿名內部類作為監聽器來處理搜索命令之外,沒有太多事情發生。通過Butter Knife,我們可以使我們的工作和編碼更容易。視圖對象存儲在欄位中,因此我們可以簡單地向每個欄位添加Butter Knife @BindView註解,如下所示:
@BindView(R.id.company_edittext) EditText companyEditText;@BindView(R.id.repository_edittext) EditText repositoryEditText;@BindView(R.id.search_button) Button searchButton;
我們還需要使onCreateView方法知道Butter Knife的存在。現在,初始化代碼將只包含以下簡短語句:
@OverridepublicViewonCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
// Inflate the layout for this fragmentView rootView = inflater.inflate(R.layout.fragment_search, container,false); ButterKnife.bind(this, rootView);returnrootView;}
我們還可以進一步,跳過綁定監聽器到searchButton方法,並改為註解onSearchButtonClicked方法,通過神奇地將之綁定到按鈕點擊的@OnClick註解:
@OnClick(R.id.search_button)public void onSearchButtonClicked(View searchButton) {
searchContributors();}
在官方的Butter Knife主頁還有其他的例子。不妨一一查看一番!一般說來,如果你需要以編程方式訪問視圖元素,那麼Butter Knife會讓你的代碼更簡潔和可讀。
2.Ice Pick
許多Android應用程序面臨的一個常見問題是活動和片段生命周期的不正確處理。是啊,我們知道,它不是Android框架最優雅的部分。但是,在AndroidManifest文件中禁用橫向模式,這樣當用戶將設備側向移動時,應用程序不會崩潰並非是一個正確的解決方案——首先,因為顯得有點傻,其次,代碼不能正確處理的配置更改仍然會發生並破壞一切!因此,你必須正確處理應用程序組件的狀態和生命周期。
實現的目的是將活動中所有欄位的內容存儲到bundle中,然後由Android框架通過生命周期正確管理。這可能是相當無聊。
幸運的是,Ice Pick使我們的生活變得容易多了,因為你再不必一個個添加所有的變數到bundle去保存。同樣從bundle中再次讀取數據,如果存在,那麼會很有挑戰性,但Ice Pick簡化了很多很多。因此,作為示例,假設我們需要記住最後一家公司和存儲庫搜索的組合。
首先,我們對要保存到bundle的欄位進行註解。
@StateString lastSearchCombination;
現在我們需要在onSaveInstanceState()方法中調用Ice Pick:
@OverridepublicvoidonSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState); Icepick.saveInstanceState(this, outState);}
也在onCreateView()方法中調用Ice Pick來恢復狀態:
@OverridepublicViewonCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
// Inflate the layout for this fragmentView rootView = inflater.inflate(R.layout.fragment_search, container,false); ButterKnife.bind(this, rootView); Icepick.restoreInstanceState(this, savedInstanceState);returnrootView;}
記住:你可以保存到bundle的內容的限制仍然存在。但是,沒有必要因為為bundle鍵添加常量或為savedInstanceState添加空檢查搞得一團亂。
3.Dart和Henson
與Ice Pick類似,Dart幫助我們避免為從一個活動傳遞到另一個活動的Intent Extras寫入所有鍵和檢查。它也適用於Fragments。這裡有一個小例子,展示了我是如何使用@InjectExtra注釋將搜索關鍵字從搜索屏幕傳遞到貢獻者列表,實際上將執行搜索的地方。
所以我使用@InjectExtra註解定義了兩個類變數:
@InjectExtraString repositoryQuery;@InjectExtraString companyQuery;
一旦Dart.inject(this, getActivity());被調用,那麼這些都將會被自動初始化。現在在Bundle中被添加到Intent的extras最終將如何。你可以手動進行,但這裡使用Henson是非常有道理的。為了使它工作,我添加以下代碼到我的SearchFragment:
Intent intentContributorsFragment = Henson.with(getActivity()) .gotoContributorsFragment() .companyQuery(companySearchKeyword) .repositoryQuery(repositorySearchKeyword).build();Intent intentContributorsActivity = Henson.with(getActivity()) .gotoContributorsActivity().build();intentContributorsActivity.putExtras(intentContributorsFragment);startActivity(intentContributorsActivity);
這簡化了代碼中活動之間的通信,而無需每次都手動指定每個txtra。
4. Parceler
Parceler幫助你進行對象序列化。它可以幫助你傳遞任何對象作為Intent extra,而不會讓你面對對象序列化的煩惱。
最好的事情是,Icepick,Henson和Dart也能很好地和Parceler一起玩。在我們的應用程序示例中,我使用@Parcel注釋了我的Contributor類。這允許我使用Dart傳遞Contributor作為Intent Extra,使我的代碼簡潔和可讀。
5.Timber
當我寫代碼的時候,過不了一會,我總有犯錯誤的傾向。通常情況下,這會導致應用程序的意外行為。我需要重現它,這樣我才能解決這個問題。當你知道重現的步驟時,調試器會很方便,但是通常情況下,日誌也包含了真相!
在Android中開箱即用的Log類足夠好,因為可以提供不同的日誌記錄級別,等等。然而,每個Log.d()語句有兩個參數;首先是tag,第二是message。99%的時間裡,tag將是this.class.getName(),並且一次又一次地寫會很煩人。幸運的是,使用Timber庫,你只要這樣做:
Timber.d("Informative output that needs to be logged.");
…並且它將為你提供正確的默認tag!此外,請記住,你需要在使用之前初始化Timber。查看我已添加調用的ContributorsApplication.onCreate()代碼:
Timber.plant(newTimber.DebugTree());
這就是正確初始化Timber所有需要做的事情,所有沒有理由你的app不使用Timber。
6.Dagger和Dagger2
最後,但並非最不重要的,Dagger和Dagger2庫在app中管理依賴注入的表現真令人驚嘆。為你處理依賴注入是編寫代碼的超棒做法。你指定應用程序的組件以及它們應如何相互交互。你可以定義代碼的哪些部分需要其他部件的工作,瞧,這個庫將為你初始化子部件,並根據需要注入它們。你可以檢查示例項目代碼以查看使用示例。
然而,Dagger和Dagger 2涉及面太廣泛了,所以在這篇文章中我們就不做詳細解釋了。如果你想從使用Dagger開始,那麼有一個很好的代碼例子,coffee maker,它也得到了優秀的注釋支持。
結論
有很多有趣的Android庫,我在這裡只列出了一些。安裝起來相當容易,因為你只需要指定依賴關係就可以了。這些都是被積極維護的項目,所以它們有偉大的文檔。
你要做的就是小心構建過程。當你開始結合多個庫與註解處理器時,確保使用provided()或annotationprocessor(),而不是在build.gradle中將它們結合起來。
本文編號2279,以後想閱讀這篇文章直接輸入2279即可。
輸入m可以獲取到文章目錄
本文內容的相關公眾號推薦
Java編程
安卓開發
更多推薦《15個技術類公眾微信》
涵蓋:程序人生、演算法與數據結構、黑客技術與網路安全、大數據技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。
※程序猿的電腦是怎麼樣個配置?
※程序猿與產品經理干架的前因後果
※你們關注掃碼中毒是么?我們這裡都世界大戰了!
※Linux中強大且常用命令:find、grep
※當程序猿突然從世界上消失……
TAG:程序猿 |
※最新研究:利用WannaCry Ransomware的代碼錯誤可以恢復你的文件
※蘋果智能音箱HomePod代碼泄露天機:iPhone 8將具備人臉識別
※常用提升Android Studio閱讀代碼效率技巧
※高階函數:利用Filter、Map和Reduce來編寫更易維護的代碼
※小心!Google Play 中出現首個使用代碼注入Android惡意軟體——Dvmap
※怎樣做代碼Review
※如何優雅的寫好Pythonic代碼?
※HomePod固件代碼顯示iPhone 8面部識別支持Apple Pay
※使用govanityurls讓私有代碼倉庫中的go包支持go get
※HomePod固件代碼暗示iPhone 8或支持面部識別
※20+行代碼使用es5 Object.defineProperty 實現簡單的watch功能
※[Android]Android焦點流程代碼分析
※代碼顯示iPhone 8面部識別技術可支持Apple Pay
※查看Python代碼性能熱力圖:pyheatmagic
※讓你的 Python 代碼優雅又地道,15篇 Python 技術熱文
※HomePod固件代碼有玄機 iPhone 8刷臉開機
※ReactiveCocoa源碼解析(一)Event與Observer代碼實現
※百萬Android設備被監聽 一個代碼就做到
※打造雲上代碼交付鏈,CodePipeline實踐分享