RxJava 基礎知識
五種觀察者
注: 使用Rxjava之前需要新增依賴
dependencies {
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
implementation 'io.reactivex.rxjava2:rxjava:2.2.0'
implementation 'io.reactivex.rxjava2:rxkotlin:2.3.0'
// 注:RxJava2 與 RxJava1 不能共存,即依賴不能同時存在
}
複製程式碼
型別 | 描述 |
---|---|
Observable | 能夠發射0或n個資料,並以成功或錯誤事件終止 |
Flowable | 能夠發射0或n個資料,並以成功或錯誤事件終止.支援背壓,可以控制資料來源發射的速度 |
Single | 只發射單個資料或錯誤事件 |
Completable | 從來不發射資料,只處理onComplete和onError事件. |
Maybe | 能夠發射0或1個資料,要麼成功,要麼失敗. |
1. Observable
能夠發射0或n個資料,並以成功或錯誤事件終止
RxJava的使用通常需要三步:
- 建立Observable
- 建立Observer
- 使用subscribe()進行訂閱
subscribe 有多個過載的方法:
- subscribe(onNext)
- subscribe(onNext,onError)
- subscribe(onNext,onError,onComplete)
- subscribe(onNext,onError,onComplete,onSubscribe)
在RxJava中,被觀察者,觀察者,subscribe()方法必須同時存在,只有使用了subscribe(),被觀察者才會開始傳送資料
Observable.just("Hello World!")
.subscribeBy(
onComplete = {Log.e("TAG","onComplete")},
onError = {Log.e("TAG",it.localizedMessage)},
onNext = {Log.e("TAG",it)}
)
複製程式碼
2. Flowable
Flowable是RxJava 2.X新增的被觀察者,Flowable可以看成Observable新的實現,它支援背壓,在這五種觀察者模式中,也只有Flowable支援背壓.同時實現Reactive Streams的Publisher介面,Flowable所有的操作符強制支援被壓
Flowable和Observable很相似,在使用場景上的區別
- Observable的使用場景
- 一般處理最大不超過1000條資料,並且幾乎不會出現記憶體溢位
- GUI滑鼠事件,基本不會背壓
- 處理同步流
- Flowable的使用場景
- 處理以某種方式產生超過10KB的元素
- 檔案讀取與分析
- 讀取資料庫記錄,也是一個阻塞的和基於拉取模式
- 網路I/O流
- 建立一個響應式非阻塞介面
3. Single
Single 只有onSuccess和onError事件.其中onSuccess用於發射資料,而且只能發射一個資料,後面即使再發射資料也不會做任何處理
Single 可以通過toXXX方法轉換成Observable,Flowable,Completable,Maybe
4. Completable
Completable 在建立後,不會發射任何資料,只有onComplete和onError事件,同時Completable並沒有map,flatMap等操作符.
Completable 經常結合andThen操作符使用
在Completable中,andThen有多個過載方法,正好對應了五種被觀察者型別
- Completable andThen(CompletableSource next)
- <T> Observable<T> andThen(ObservableSource next)
- <T> Flowable<T> andThen(FlowableSource next)
- <T> Single<T> andThen(SingleSource next)
- <T> Maybe<T> andThen(MaybeSource next)
Completable 可以通過toXXX方法轉換成Observable,Flowable,Single,Maybe
Completable.fromAction { Log.e("TAG","Hello") }
.andThen(Observable.just(1))
.subscribeBy(
onNext = {Log.e("TAG",it.toString())}
)
複製程式碼
5. Maybe
Maybe 是RxJava 2.X 之後才有的新型別,可以看成是Single和Completable的結合
do操作符
do操作符可以給Observable的生命週期的各個階段加上一系列的回撥監聽,當Observable執行到這個階段時,這些回撥就會觸發.
操作符 | 用途 |
---|---|
doOnSubscribe | 一旦觀察者訂閱了Observable,它就會呼叫 |
doOnLifecycle | 可以在觀察者訂閱之後, 設定是否取消訂閱 |
doOnNext | 它產生的Observable每發射一條資料就會呼叫它一次,它的Consumer接受發射的資料項,一般用於在subscribe之前對資料進行處理 |
doOnEach | 它產生的Observable每發射一條資料就會呼叫它一次,不僅包括onNext,還包括onComplete和onError |
doAfterNext | 在onNext之後執行,而doOnNext()是在onNext之前執行 |
doOnComplete | 當它產生的Observable在正常終止呼叫onComplete時會被呼叫87 |
doFinally | 在當它產生的Observable終止之後會被呼叫,無論是正常終止還是異常終止,doFinally優先於doAfterTerminate的呼叫 |
doAfterTerminate | 註冊一個Action當Observable呼叫onComplete或onError時會觸發 |
Observable.just("Hello")
.doOnNext { Log.e("TAG","doOnNext: $it") }
.doAfterNext { Log.e("TAG","doAfterNext: $it") }
.doOnComplete { Log.e("TAG","doOnComplete") }
.doOnSubscribe { Log.e("TAG","doOnSubscribe") }
.doAfterTerminate { Log.e("TAG","doAfterTerminate") }
.doFinally { Log.e("TAG","doFinally") }
.doOnEach { Log.e("TAG","doOnEach: ${if (it.isOnNext) "onNext" else (if (it.isOnComplete) "onComplete" else "onErrpr")}") }
.doOnLifecycle({ Log.e("TAG","doOnLifecycle: ${it.isDisposed}") }, { Log.e("TAG","doOnLifecycle run: ") })
.doOnError { Log.e("TAG","doOnError: ${it.localizedMessage}") }
.doOnTerminate { Log.e("TAG","doOnTerminate: ") }
.doOnDispose { Log.e("TAG","doOnDispose: ") }
.subscribeBy(
onNext = {Log.e("TAG","onNext: $it")},
onError = {Log.e("TAG","onError: ${it.localizedMessage}")},
onComplete = {Log.e("TAG","onComplete")}
)
複製程式碼
執行結果:
doOnSubscribe
doOnLifecycle: false
doOnNext: Hello
doOnEach: onNext
onNext: Hello
doAfterNext: Hello
doOnComplete
doOnEach: onComplete
doOnTerminate:
onComplete
doFinally
doAfterTerminate複製程式碼
以上是RxJava一些基礎概念和生命週期的知識梳理, 後續會更新RxJava其他知識的學習筆記.