天天看點

RxJava Android(RxAndroid) 開發全家桶

RxJava 在 Android 應用開發中越來越流行,但是由于其門檻稍高,初次使用不免遇到很多問題,例如在 RxJava 常見的錯誤用法 和 不該使用 RxJava 的一些情況 中所描述的情況。為了避免這些常見的問題,很多民間高手開發了很多在 Android 應用中可以使用的 Rx 擴充類庫,組合使用這些類庫,可以更友善的使用 RxJava 并且可以避免一些常見的錯誤用法。 本文來介紹一些使用 RxJava 必備的擴充庫。

RxAndroid

RxAndroid 這個就毫無疑問了, Android 開發中使用 RxJava 必備元素,雖然裡面隻是提供了簡單的兩個功能。 AndroidSchedulers.mainThread() 和 AndroidSchedulers.handlerThread(handler) ,但這确是 Android 開發中最核心的功能之一。

RxBinding

RxBinding 是把 Android 中各種 UI 控件的事件轉換為 RxJava 中的資料流。這樣就可以把 UI 控件的事件當做 RxJava 中的資料流來使用了。 比如 View 的 onClick 事件,使用 RxView.clicks(view) 即可擷取到一個 Observable 對象,每當使用者點選這個 View 的時候,該 Observable 對象就發射一個事件(onNext 被調用), Observable 的 Observer 訂閱者就可以通過 onNext 回調知道使用者點選了 View。

RxLifecycle

RxLifecycle 配合 Activity/Fragment 生命周期來管理訂閱的。 由于 RxJava Observable 訂閱後(調用 subscribe 函數),一般會在背景線程執行一些操作(比如通路網絡請求資料),當背景操作傳回後,調用 Observer 的 onNext 等函數,然後在 更新 UI 狀态。 但是背景線程請求是需要時間的,如果使用者點選重新整理按鈕請求新的微網誌資訊,在重新整理還沒有完成的時候,使用者退出了目前界面傳回前面的界面,這個時候重新整理的 Observable 如果不取消訂閱,則會導緻之前的 Activity 無法被 JVM 回收導緻記憶體洩露。 這就是 Android 裡面的生命周期管理需要注意的地方,RxLifecycle 就是用來幹這事的。比如下面的示例:

myObservable
    .compose(RxLifecycle.bindUntilEvent(lifecycle, ActivityEvent.DESTROY))
    .subscribe();
           

在 Activity 銷毀的時候, RxLifecycle 會自動取消訂閱這個 Observer。 這樣就不用自己手動管理了。

Retrofit

現在幾乎大部分的 Android 應用都需要請求網絡擷取資料,而 Retrofit 就是用來簡化網絡請求的一個庫,并且支援 RxJava。比如:

@GET("/users/{user}")
    Observable<User> user(@Path("user") String user);
           

上面的代碼定義了一個 GET 請求,請求的路徑是 /users/{user}并且帶有一個使用者名的參數。 傳回的結果為 一個 Observable 。 這樣配合前面的 RxBinding,就可以很容易的實作一個 使用者點選一個重新整理按鈕去請求伺服器資料的操作。

RxView.clicks(view).flatMap(v -> githubService.user(user)).subscribe();

SqlBrite

如果您的應用使用了 Sqlite 來儲存資料的話,則 SqlBrite 是個很好的配合 RxJava 使用的庫。

除了上面這些主要的類庫外,還有一些封裝其他 Android 服務的庫:

  • Rx Preferences 通過 RxJava 的方式來通路 SharedPreferences。
  • RxPermissions 用于支援 Android M 動态權限申請的庫。

還有一些配合 Google Play Service 服務的庫:

  • RxFit 封裝了 Fitness API 的調用。
  • RxNotification 封裝了 firebase 通知 api。
  • Android-ReactiveLocation 封裝了 Google Play Service API 中和位置相關的 api。

如果您要是開發 Android Wear 應用的話,會使用到 Wearable API 來實作手表和手機直接的資料通信,則可以使用 RxWear 庫。

繼續閱讀