在Android中開始使用RxJava 2
Chinese (Traditional) (中文(繁體)) translation by tianyiliang (you can also view the original English article)
如果你是Android開發人員,那麼你可能已經聽說過RxJava,RxJava是ReactiveX實現的流行開源庫,它將回應式程式設計引入到了Java虛擬機器(JVM)。
RxJava的設計是為了擺脫非同步資料流程的痛苦,而且RxJava對“資料”的定義非常廣泛。因為RxJava是一個JVM相容庫,可以在各種平臺上使用,在本系列中,我將展示如何使用RxJava 2進行Android開發。
在本系列的最後,你將掌握所有的RxJava 2要素,以便你創建回應式APP,處理各種同步和非同步資料,而且實現所有這些功能比使用Java實現更簡潔和可管理。
除了給RxJava新手提供介紹,如果你是RxJava 1老手,希望升級到RxJava 2,那麼這個系列將有助於使你順利過渡。雖然升級到最新版本的庫可能聽起來不是大事,但RxJava 2並不是典型的升級 - 它完全重寫了RxJava 1。 這種升級變化太大,初學者很容易困惑,所以需要一些時間來熟悉RxJava 2,而且從長遠來看可以節省大量的時間和避免以後的沮喪。
在第一篇文章中,我將介紹什麼是RxJava和它為Android開發人員提供的主要優點。我們也將深入瞭解RxJava項目的核心部件:Observers
,Observables
和訂閱。 在本教程結束之前,將創建一個包含所有這些核心元件的“Hello World” APP。
RxJava另一個主要模組是運算子,因此在第二部分中,我將使用運算子轉換,組合,過濾和操作APP資料。
在最後一期中,我們將超越核心的RxJava庫並學習RxAndroid,RxAndroid這是一個完整的庫,它包含了所有Android特定的擴展,你需要解鎖Android回應式程式設計的全部潛力。
我們需要學習很多,所以讓我們開始的吧:
我們需要學習很多,所以讓我們開始的吧:
RxJava是一個庫,可以以響應式程式設計風格創建APP。其核心是回應式程式設計,這種程式設計提供了一種乾淨,有效的方式來處理和回應即時資料流,包括具有動態值的資料。
這些資料流程不一定都採取傳統的資料類型形式,RxJava幾乎將一切事物看成資料流程,從變數到特性,快取記憶體,甚至點擊和劃動這類用戶輸入事件。
每個被發射的資料流程可以是一個值,一個錯誤或一個“完成的”信號,儘管你不一定要實現最後兩個。創建資料發送流之後,將它們與操作和消耗資料的回應式物件組合起來,然後對該資料執行不同的操作。 RxJava包括一大堆有用的操作符來處理資料流程,諸如過濾,映射,延遲,計數等操作。 RxJava包括一大堆有用的操作符來處理資料流程,諸如過濾,映射,延遲,計數等操作。



為了創建資料流程的工作流程和回應它們的物件,RxJava繼承了Observer軟體設計模式。本質上,在RxJava中,你有發射資料流程然後終止資料流程的Observable
物件,以及訂閱Observable
的Observer
物件。 Observer
訂閱的Observable發射值,錯誤,或一個完成信號後,Observer
會接收到通知。
所以RxJava是關於:
- 創建
Observable
。 - 給
Observable
一些資料發發射。 - 創建
Observer
。 - 分配
Observer
給Observable
。 -
Observer
接收到Observable
發射的資料後,Observer執行任務。
為什麼要學習RxJava?
學習任何新技術都需要時間和精力,而作為面向資料的庫,RxJava的API並不總是很簡單。
為了幫助你決定是否值得學習RxJava,將介紹RxJava庫添加到Android項目的主要優點。
更簡潔,可讀性更強的代碼
複雜,冗長和難以閱讀的代碼總是壞消息。淩亂的代碼更容易出現錯誤和低效,如果發生錯誤,而你的代碼又一團糟,那麼你要花費更多的時間追蹤錯誤根源。
即使你的專案確沒有錯誤,代碼太複雜也會困擾你 - 通常當你決定在幾個月內更新你的APP,啟動項目,你立即要面糾結、混亂的代碼!
RxJava還提供了一個標準工作流程,你可以使用它來處理整個APP中的所有資料和事件 - 創建一個Observable,Observer,把Observable分配給Observer。 這個公式化方法使得非常代碼直接和人性化。
使得多執行緒更易用
如今的Android APP需要能夠進行多工。至少在你APP後臺執行某些工作(例如管理網路連接,下載檔案或播放音樂)時,使用者將能夠繼續與APP的UI進行交互。 問題是Android預設情況下是單執行緒的,所以那麼你需要創建多執行緒來執行多工。
開箱即用,Android確實提供了許多方法來創建其他執行緒,例如services和IntentServices
,但是這些解決方案都不是特別容易實現的,而且代碼複雜、冗長和容易出錯。
RxJava旨在通過提供特殊的調度程式和操作符來創建多執行緒Android APP。這些給你簡單的方法來指定應該執行工作的執行緒以及應該發射結果的執行緒。 RxJava 2.0預設包括一些調度程式,包括Schedulers.newThread
,它在創建新執行緒時特別有用。
要修改執行工作的執行緒,只需使用subscribeOn
運算子更改observer訂閱observable的位置。例如,在這裡,我們正在創建一個新執行緒,並指定在這個新執行緒上執行的工作:
observable.subscribeOn(Schedulers.newThread())
Android中多執行緒的另一個長期存在的問題是你只能從主執行緒更新UI。通常,必須創建一個專用的Handler
,才能將後臺工作的結果發送到APP的UI中。
RxJava有一個更直接的解決方案。可以使用 observeOn運算子指定Observable
使用不同的調度程式發送通知,這本質上允許你將Observable的資料發送到選擇的執行緒,包括主UI執行緒。
這意味著只需兩行代碼就可以創建一個新的執行緒,並將此執行緒上執行的結果發送給Android的主UI執行緒:
.subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread())
好吧,這裡我們作弊了,因為只有在RxAndroid庫中才可以使用AndroidSchedulers.mainThread
,我們在第三部分中才能看到。不過,這個例子可以讓你瞥見RxJava和RxAndroid的力量來簡化複雜的Android開發領域。
提高靈活性
Observables以完全隱藏創建資料的方式發射資料。由於的observers甚至無法看到資料的創建方式,你可以隨意以任何方式實現Observable
。
一旦你實現了Observable
,RxJava提供了龐大的運算子集合,可以使用它們來過濾,合併和轉換由這些Observable
s 發射的資料。甚至可以將越來越多的操作符連在一起,直到準確創建 了APP所需的資料流程。
例如,可以組合來自多個流的資料,過濾新合併的流,然後使用生成的資料作為後續資料流程的輸入。記住,在RxJava中,幾乎所有內容都被看作資料流程,因此你甚至可以將這些運算子應用于非傳統的“資料”,例如點擊事件。
創建高回應APP
在APP中可以通過載入內容頁面然後等待使用者點擊“ 下一步” 按鈕的,這種操作已經過時了。現在,典型的移動APP需要能夠對日益增長的各種事件和資料做出即時回應。 例如,典型社交網路APP需要不斷監聽傳入的喜好,評論和朋友請求,同時在後臺管理網路連接,並在使用者點擊或滑動螢幕時立即回應。
RxJava庫旨在能夠同時和即時地管理廣泛的資料和事件,使其成為創建高回應APP的強大工具。
將RxJava添加到Android Studio
如果你覺得RxJava確實有益於Android開發,那麼成為引入RxJava的第一步就是添加依賴庫。
使用你選擇的設置創建一個新的Android Studio項目,然後打開module級的build.gradle檔,並添加最新版本的io.reactivex.rxjava2:rxjava
依賴關係。
在撰寫本文時,RxJava 2.0.5是最新版本,所以我的build.gradle文件如下所示:
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.1.0' testCompile 'junit:junit:4.12' compile 'io.reactivex.rxjava2:rxjava:2.0.5' }
出現提示時,點擊立即同步。
接下來,打開MainActivity
檔並添加RxJava核心功能包:
import io.reactivex.Observable; import io.reactivex.ObservableEmitter; import io.reactivex.ObservableOnSubscribe; import io.reactivex.Observer; import io.reactivex.disposables.Disposable;
如果你正在從RxJava 1遷移過來,那麼這些導入可能不是你期望的,因為RxJava 1使用完全不同的包名稱( 確切地說是rx
)。
但是,這不是一個隨意更改名稱:不同的包名稱可以讓你在同一個項目中並行使用RxJava 1和RxJava 2。你可以在使用RxJava 1的專案中途添加RxJava 2庫並立即開始使用新功能,而不必中斷任何RxJava 1代碼。
如果你開始使用RxJava2,那麼請注意,如果你遇到任何RxJava教程或使用rx
套裝程式名稱的代碼,那麼這是RxJava 1代碼,並且不太可能與版本2庫相容。
RxJava的構建塊
到目前為止,我們只是在很高的層次上看過RxJava。現在是時候具體深入瞭解在RxJava工作期間再次出現的兩個最重要的元件:Observers
和Observable
s。
在本節結束之前,你不僅可以對這兩個核心元件有一個牢固的瞭解,而且你將創建一個功能齊全的APP,其中包含一個發出資料的Observable
和響應資料的Observer
。
創建一個 Observable
Observable
類似於Iterable
,對於給定序列,Observable遍歷該序列並發射每項,一旦Observer
訂閱了Observable
,Observable就開始發送資料。
每次Observable
發射資料時,它會通過該onNext()
方法通知Observer
。一旦Observable
已經發送了所有的值,它終止於:
-
onComplete
操作成功時調用。 -
onError
拋出Exception
調用。
我們來看一個例子。在這裡,我們創建Observable,發射數字1,2,3和4,然後終止。
Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() { @Override public void subscribe(ObservableEmitter<Integer> e) throws Exception { //Use onNext to emit each item in the stream// e.onNext(1); e.onNext(2); e.onNext(3); e.onNext(4); //Once the Observable has emitted all items in the sequence, call onComplete// e.onComplete(); } } );
請注意,在這個例子中,我要解釋一些東西,所以不要讓代碼量減少!這裡的代碼比Observable
在平時的RxJava項目中要多。
創建一個Observer
Observable
使用subscribe()
操作符訂閱Observers
。一旦Observable
訂閱 Observer
,只要Observer
發射了如下的內容,Observable就作出回應:
-
onNext
:Observable
已經發射了一個值。 -
onError
: 發生了錯誤。 -
onComplete
:Observable
發射完了所有的值。
我們創建一個Observer
訂閱我們的Observable
。為了簡化起見,這裡Observer
通過列印一個消息到Android Studio的logcat的監控來響應onNext
,onError
和onComplete
:
Observer<Integer> observer = new Observer<Integer>() { @Override public void onSubscribe(Disposable d) { Log.e(TAG, "onSubscribe: "); } @Override public void onNext(Integer value) { Log.e(TAG, "onNext: " + value); } @Override public void onError(Throwable e) { Log.e(TAG, "onError: "); } @Override public void onComplete() { Log.e(TAG, "onComplete: All Done!"); } }; //Create our subscription// observable.subscribe(observer);
通過從Android Studio視窗的底部選擇Android Monitor選項卡(其中游標位於下面的螢幕截圖),然後選擇Logcat選項卡,打開Android Studio的Logcat監視器。



要運行此代碼,請將你的物理Android設備連接到電腦,或者在相容的AVD上運行APP。只要你的APP出現在螢幕上,你應該看到Observable發出的資料。



用較少的代碼創建Observable
雖然我們的專案正在成功發射資料,但我們使用的代碼並不完全簡潔 - 特別是創建Observable
的代碼。
幸運的是,RxJava提供了一些方便的方法來用更少的創建Observable
:
1. Observable.just()
可以使用.just()
運算子將任何物件轉換為Observable
。Observable
將發出原始物件並完成。
例如,這裡我們創建一個Observable
將發出一個字串的所有訂閱了Observable的Observers
:
Observable<String> observable = Observable.just("Hello World!");
2. Observable.from()
該.from()
操作符將物件的集合轉換成可觀察到的資料流程。你可以使用Observable.fromArray
將陣列轉換成Observable
,使用Observable.fromCallable
將Callable
轉換為Observable
,以及使用Observable.fromIterable
將Iterable
轉換為Observable
。
3. Observable.range()
可以使用.range()
運算子發出多個自然數。你提供的第一個整數是初始值,第二個是您要發出的整數數。例如:
Observable<Integer> observable = Observable.range(0, 5);
4. Observable.interval()
該運算子創建一個Observable
發出無限序列的昇冪整數,每個發射由你選擇的時間隔開。例如:
Observable<Long> observable = Observable.interval(1, TimeUnit.SECONDS)
5. Observable.empty()
empty()
創建一個Observable
,只發射終止,當你需要快速創建一個測試的Observable
時有用。
Observable<String> observable = Observable.empty();
結論
在本文中,我們學習了RxJava的基礎知識。
現在,你知道了如何創建和使用Observers
和Observables
,以及如何訂閱,這樣Observables
就可以開始發射資料。我們還簡要地探索了一些操作符,可以讓你用較少的代碼創建一系列不同的Observables
。
但是,操作符不僅僅是減少代碼量的方便之選!創建一個Observer
和一個Observable
本身很簡單,但操作符才是RxJava真正的魅力所在。
所以在下一篇文章中,我們將研究RxJava中強大的運算子,其中包括可以在Android上實現多執行緒流暢體驗的操作符。請繼續關注RxJava的真正魅力。
與此同時,請閱讀Envato Tuts +上的關於Android開發的其他文章和課程!
- Android Studio使用Kotlin編寫回應式安卓APP:開始Jessica Thornsby
- Android使用Flutter 和 Dart編寫安卓APPAshraff Hathibelagal
- Android SDKFirebase有什麼新特性?從Firebase Dev Summit升級Chike Mgbemena
- Android在安卓APP中使用MD風格Ashraff Hathibelagal
Observable的資料流程圖來自ReactiveX文檔,由知識共用署名3.0授權合約授權。