RxJava2知识回顾之RxJava基本流程

今天回顾下RxJava2的基本流程

步骤一:引入RxJava和RxAndroid

    implementation 'io.reactivex.rxjava2:rxjava:2.2.0'
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'

步骤二:RxJava是基于观察者模式,需要创建一个被观察者,一个观察者对象,分别对应着RxJava中的Observable和Observer。

        //被观察者,发送事件
        Observable observable = Observable.create(new ObservableOnSubscribe() {
            @Override
            public void subscribe(ObservableEmitter emitter) throws Exception {
                //发送一个事件
                emitter.onNext(1);
                //发送完成,但是仅仅是告诉下游不再接受上游的发送事件,上游还可以继续发送事件
                emitter.onComplete();
                //发送Error,与onComplete类似,两者互斥,只能发送两者中的一个
                emitter.onError(new NullPointerException());
            }
        });

        //观察者,接受被观察者发送的事件
        Observer observer = new Observer() {
            @Override
            public void onSubscribe(Disposable d) {
                //Disposable用于控制上下游事件的阀门,在Activity生命周期结束时,应该调用disposable.dispose()
                disposable = d;
            }

            @Override
            public void onNext(Integer integer) {
                //onNext用于接收上游发送的事件
                if(integer>2){
                    disposable.dispose();
                }
            }

            @Override
            public void onError(Throwable e) {
                //接收上游发送的error
            }

            @Override
            public void onComplete() {
                //接收上游发送的complete通知
            }
        };
        //两者通过subscribe进行订阅
        observable.subscribe(observer);//默认Observable与Observer在同一线程;

注意: 只有当上游和下游建立连接之后, 上游才会开始发送事件. 也就是调用了subscribe() 方法之后才开始发送事件.

ObservableEmitter: Emitter是发射器的意思,那就很好猜了,这个就是用来发出事件的,它可以发出三种类型的事件,通过调用emitter的onNext(T value)、onComplete()和onError(Throwable error)就可以分别发出next事件、complete事件和error事件。

但是,请注意,并不意味着你可以随意乱七八糟发射事件,需要满足一定的规则:

  • 上游可以发送无限个onNext, 下游也可以接收无限个onNext.

  • 当上游发送了一个onComplete后, 上游onComplete之后的事件将会继续发送, 而下游收到onComplete事件之后将不再继续接收事件.

  • 当上游发送了一个onError后, 上游onError之后的事件将继续发送, 而下游收到onError事件之后将不再继续接收事件.

  • 上游可以不发送onComplete或onError.

  • 最为关键的是onComplete和onError必须唯一并且互斥, 不能发多个onError, 也不能先发一个onComplete, 然后再发一个onError, 反之亦然。

Disposable:用于控制上下游事件的阀门,在Activity生命周期结束时,应该调用disposable.dispose()。

  • ObserveronSubscribe回调中,会传入一个Disposable对象,下游可以通过该对象的dispose()方法主动切断和上游的联系,在这之后上游的observableEmitter.isDisposed()方法将返回true

  • 当上游和下游的联系切断之后,下游收不到包括onComplete/onError在内的任何事件,若此时上游再调用onError方法发送事件,那么将会报错。

注意

  • 关于onComplete和onError唯一并且互斥这一点, 是需要自行在代码中进行控制,如果你的代码逻辑中违背了这个规则, 并不一定会导致程序崩溃。

  • 比如发送多个onComplete是可以正常运行的, 依然是收到第一个onComplete就不再接收了, 

  • 但若是发送多个onError,则收到第二个onError事件会导致程序会崩溃。

  • 调用dispose()并不会导致上游不再继续发送事件, 上游会继续发送剩余的事件.

RxJava2知识回顾之RxJava基本流程_第1张图片

你可能感兴趣的:(RxJava)