當前位置:
首頁 > 知識 > 6個可以讓代碼變得更整潔的Android庫

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元素越多,那麼單個方法就會越長。


讓我們舉個簡單的例子:

6個可以讓代碼變得更整潔的Android庫



此視圖將需要三個視圖:兩個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實踐分享