RxJava2.X使用小记

作者: 进击de小黑 | 来源:发表于2018-11-21 17:50 被阅读15次

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()是操作在整个流上的。

Subject

在RxJava2.x中,官方一共为我们提供了以下几种Subject:

    ReplaySubject (释放接收到的所有数据)
    BehaviorSubject (释放订阅前最后一个数据和订阅后接收到的所有数据)
    PublishSubject (释放订阅后接收到的数据)
    AsyncSubject (仅释放接收到的最后一个数据)
    SerializedSubject(串行Subject)
    UnicastSubject (仅支持订阅一次的Subject)

ReplaySubject 无论是在接收到数据前还是数据后订阅,ReplaySubject都会发射所有数据给订阅者:通过一个List动态存储所有接收到的数据,当被订阅时,将所有的数据都发送给订阅者。

BehaviorSubject其原理就是通过subscribers这个核心的成员,它是一个不断变化的数组。在创建时,其内部只是一个EMPTY(BehaviorDisposable)对象,每次被订阅,都会在既有的数组上新加一个BehaviorDisposable对象,这个对象中包含了一个List,存储之后会收到的数据。
同时,BehaviorSubject还有一个value的成员,该成员会随着数据的不断接收而进行更新,它总是记录着当前最后一个接收到的数据,当被subscribe时,会执行emitFirst()方法,发射当前记录的数据,也就是订阅前接收到的最后一个数据。RxLifecycle核心类

PublishSubject 其原理就是通过subscribers这个核心的成员,它是一个不断变化的数组。在创建时,其内部只是一个EMPTY(BehaviorDisposable)对象,每次被订阅,都会在既有的数组上新加一个BehaviorDisposable对象,这个对象中包含了一个List,存储之后会收到的数据。RxBus事件总线核心类

相关文章

网友评论

    本文标题:RxJava2.X使用小记

    本文链接:https://www.haomeiwen.com/subject/npmcqqtx.html