RxJava2.X使用小記
Transformer轉換器,Observable.compose()
Observable.compose()操作符是直接對當前Observable進行操作;
Transformer實際上就是Func1<Observable,Observable>,換句話說就是提供給他一個Observable它會返回給你另一個Observable。ObservableTransformer、SingleTransformer、FlowableTransformer
建立一個SingleTransformer排程器:
<T> SingleTransformer<T, T> applySchedulers() { return new SingleTransformer<T, T>() { @Override public Observable<T> call(Single<T> single) { return single .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .compose(bindUntilEvent(FragmentEvent.STOP));//內部也是轉換器 } }; }
doOnSubscribe、doFinally
RetrofitHelper.getHiboxService().getOpSaveOrderInfo(PbOpenPlatformHelper.getSaveOrderInfoReq(saveCode)) .compose(bindUntilEvent(FragmentEvent.STOP)) .subscribeOn(Schedulers.io())//指定getOpSaveOrderInfo執行緒 .doOnSubscribe(disposable1 -> UiUtil.netDialogShow(sfDialog, getActivity()))//訂閱即執行 .subscribeOn(AndroidSchedulers.mainThread())//指定doOnSubscribe的執行緒 .observeOn(AndroidSchedulers.mainThread())//指定doFinally,subscribe()的執行緒 .doFinally(() -> UiUtil.netDialogDiss(sfDialog, getActivity()))//訂閱結束,無論異常還是成功 .subscribe(saveCodeOrderInfoResp -> { }, throwable -> { } );
compose()和flatMap()
compose()和flatMap()都是發射出Observable,不同於map、flatMap等lift操作改變Observable釋出的事件及序列,compose操作符是直接對當前Observable進行操作。
1.compose() 是唯一一個能從流中獲取原生Observable 的方法,因此,影響整個流的操作符(像subscribeOn()和observeOn())需要使用compose(),相對的,如果你在flatMap()中使用subscribeOn()/observeOn(),它隻影響你建立的flatMap()中的Observable,而不是整個流。
2.當你建立一個Observable流並且內聯了一堆操作符以後,compose()會立即執行,flatMap()則是在onNext()被呼叫以後才會執行,換句話說,flatMap()轉換的是每個專案,而compose()轉換的是整個流。
3.flatMap()一定是低效率的,因為他每次呼叫onNext()之後都需要建立一個新的Observable,compose()是操作在整個流上的。