rxjava
五種觀察者模式
| 被觀察者 | 觀察者 | 描述 |
|---|---|---|
| Observable | Observer | 能夠發(fā)射0或n個數(shù)據(jù),并以成功或失敗結(jié)束 |
| Flowable | Subscriber | 能夠發(fā)射0或n個數(shù)據(jù),并以成功或失敗結(jié)束。支持背壓,可以控制數(shù)據(jù)源的發(fā)射速度 |
| Single | SingleObserver | 只發(fā)射單個數(shù)據(jù)或錯誤事件 |
| Comletable | CompleteableObserver | 從來不發(fā)射數(shù)據(jù),只處理onComplete和onError事件,可以看成Rx的Runnable |
| Maybe | MabyeObserver | 能夠發(fā)射0或1個數(shù)據(jù),要么成功,要么失敗,有點類似于Optional |
do操作符
do操作符給Observable的聲明周期的各個階段加上一些列的回調(diào)監(jiān)聽。
下表總結(jié)了一些常用的do操作符,按照執(zhí)行的順序。
| 操作符 | 描述 |
|---|---|
| doOnSubscribe | 一旦觀察者訂閱了Observable,它就會被調(diào)用 |
| doOnLifeCycle | 可以在觀察者訂閱之后,設(shè)置是否取消訂閱 |
| doOnNext | 它產(chǎn)生的observable每發(fā)射一項數(shù)據(jù)就會調(diào)用它一次,它的Consumer接受發(fā)射的數(shù)據(jù)項。一般用于在subscribe之前對數(shù)據(jù)進行處理 |
| doOnEach | 它產(chǎn)生的Observable沒法涉一項數(shù)據(jù)就會調(diào)用它一次,不僅包括onNext,還包括onError和onCompleted |
| doOnAfterNext | 在onNext之后執(zhí)行,而doOnNext在onNext之前執(zhí)行 |
| doOnComplete | 它產(chǎn)生的Observable在正常終止調(diào)用onComplete時被調(diào)用 |
| doFinally | 當它產(chǎn)生的Observable終止之后會被調(diào)用,無論是正常終止還是異常終止。doFinally優(yōu)先doAfterTerminate的調(diào)用 |
| doAfterTerminate | 注冊一個Action,當Observable調(diào)用onComplete或onError時觸發(fā) |
Observable分類
observable分為Hot和Cold。
Hot Observable無論有沒有觀察者進行訂閱,事件始終會發(fā)生。當Hot Observable有多個訂閱者時,Hot Observable與訂閱者們的關(guān)系是一對多的關(guān)系,可以與多個訂閱者共享信息。
Cold Observable是只有觀察者訂閱了,才開始執(zhí)行發(fā)射數(shù)據(jù)流的代碼。并且Cold Observable和Observer只能是一對一的關(guān)系。當有多個不同的訂閱者時,消息是重新完整發(fā)送的。也就是說對Cold Observable而言,有多個Observser的時候,他們各自的消息是獨立的。
Cold Observable
Observable的just,create,range,fromXXX等操作符都能生成Cold Observable。
Cold Observable和Hot Observable的轉(zhuǎn)換
- 使用publish,生成ConnectableObservable,將原來的Observable轉(zhuǎn)換成ConnectableObservable。
- 使用Subject/Processor。Subject和Processor作用相同,Processor是RxJava 2.x新增的類,繼承自Flowable,支持背壓控制(Back Presure),而Subject則不支持背壓控制。Subject既是Observable又是Observer。Subject作為觀察者,可以訂閱目標Cold Observable,使對方開始發(fā)送事件,同時它又作為Observable轉(zhuǎn)發(fā)或者發(fā)送新的事件,讓Cold Observable借助Subject轉(zhuǎn)換為Hot Observable。Subject不是線程安全的,如果想要線程安全,則需要調(diào)用toSerialized()。
熱Observable轉(zhuǎn)為Cold Observable
使用ConnectableObservable的refCount操作符。refcount操作符把從一個可連接的Observable連接和斷開過程自動化了。操作一個Observable,返回一個普通的Observable,當?shù)谝粋€訂閱者/觀察者訂閱這個Observable時,RefCount連接到下層的可連接Observable,RefCount跟蹤有多少個觀察者訂閱它,指導最后一個觀察者完成,才斷開與下層Observable的連接。如果所有的訂閱者/觀察者都取消訂閱了,則數(shù)據(jù)流停止,如果重新訂閱,則重新開始數(shù)據(jù)流。如果部分觀察者取消訂閱,則部分觀察者重新訂閱,則不會從頭開始數(shù)據(jù)流。
使用share操作符。share操作符封裝了publish().refCount()調(diào)用。不需要再調(diào)用connect方法,直接使用share方法即可。
Flowable
RxJava2.x新增,支持背壓。
Maybe,Single,Completable
Single
只有onSUccess,onError事件。onSuccess用于發(fā)射數(shù)據(jù),且只能發(fā)射一個數(shù)據(jù),后續(xù)數(shù)據(jù)拋棄。
Subject
Subject既是Observable又是Observer。分為AsyncSubject,BehaviorSubject,ReplaySUbject,PublishSubject。
| Subject | 發(fā)射行為 |
|---|---|
| AsyncSubject | 不論訂閱發(fā)生在什么時候,只發(fā)射最后一個數(shù)據(jù) |
| BehaviorSubject | 發(fā)射訂閱前的一個數(shù)據(jù),和訂閱之后的全部數(shù)據(jù) |
| ReplaySubject | 不論什么時候訂閱,都發(fā)射全部數(shù)據(jù) |
| PublishSubject | 發(fā)射訂閱后的全部數(shù)據(jù) |