Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android資訊 >> 6 個可以讓代碼變得更整潔的 Android 庫

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

編輯:Android資訊

本文由碼農網 – 小峰原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃!

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,我們需要在片段中引用。一般我們會這樣做:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
  // Inflate the layout for this fragment
  View 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(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
      searchContributors();
    }
  });
  return rootView;
}

在代碼中除了從布局中查找視圖,將它們存儲在活動的字段中,以及添加一個匿名內部類作為監聽器來處理搜索命令之外,沒有太多事情發生。通過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的存在。現在,初始化代碼將只包含以下簡短語句:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
  // Inflate the layout for this fragment
  View rootView = inflater.inflate(R.layout.fragment_search, container, false);
  ButterKnife.bind(this, rootView);
  return rootView;
}

我們還可以進一步,跳過綁定監聽器到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的字段進行注解。

@State String lastSearchCombination;

現在我們需要在onSaveInstanceState()方法中調用Ice Pick:

@Override
public void onSaveInstanceState(Bundle outState) {
  super.onSaveInstanceState(outState);
  Icepick.saveInstanceState(this, outState);
}

也在onCreateView()方法中調用Ice Pick來恢復狀態:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                        Bundle savedInstanceState) {
  // Inflate the layout for this fragment
  View rootView = inflater.inflate(R.layout.fragment_search, container, false);
  ButterKnife.bind(this, rootView);
  Icepick.restoreInstanceState(this, savedInstanceState);
  return rootView;
}

記住:你可以保存到bundle的內容的限制仍然存在。但是,沒有必要因為為bundle鍵添加常量或為savedInstanceState添加空檢查搞得一團亂。

3.Dart和Henson

與Ice Pick類似,Dart幫助我們避免為從一個活動傳遞到另一個活動的Intent Extras寫入所有鍵和檢查。它也適用於Fragments。這裡有一個小例子,展示了我是如何使用@InjectExtra注釋將搜索關鍵字從搜索屏幕傳遞到貢獻者列表,實際上將執行搜索的地方。

所以我使用@InjectExtra注解定義了兩個類變量:

@InjectExtra String repositoryQuery;
@InjectExtra String 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(new Timber.DebugTree());

這就是正確初始化Timber所有需要做的事情,所有沒有理由你的app不使用Timber。

6.Dagger和Dagger2

最後,但並非最不重要的,Dagger和Dagger2庫在app中管理依賴注入的表現真令人驚歎。為你處理依賴注入是編寫代碼的超棒做法。你指定應用程序的組件以及它們應如何相互交互。你可以定義代碼的哪些部分需要其他部件的工作,瞧,這個庫將為你初始化子部件,並根據需要注入它們。你可以檢查示例項目代碼以查看使用示例。

然而,Dagger和Dagger 2涉及面太廣泛了,所以在這篇文章中我們就不做詳細解釋了。如果你想從使用Dagger開始,那麼有一個很好的代碼例子,coffee maker,它也得到了優秀的注釋支持。

結論

有很多有趣的Android庫,我在這裡只列出了一些。安裝起來相當容易,因為你只需要指定依賴關系就可以了。這些都是被積極維護的項目,所以它們有偉大的文檔。

你要做的就是小心構建過程。當你開始結合多個庫與注解處理器時,確保使用provided()或annotationprocessor(),而不是在build.gradle中將它們結合起來。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved