Rxjava2中Concat操作符onNext,OnError,OnComplte的执行顺序

本文只是通过例子,把concat操作符中自定义Observable中onNext,onError,onComplte在subscribe后的执行顺序打印出来给大家看看.(concat操作符的作用是连接操作符,可接受Observable的可变参数,或者Observable的集合然后顺序的发送出去,注意是有序的发送,那么这个就可以应用在开发中很多有序的事件,比如接广告…)

废话不多说,我们先看下没有执行之前的代码

observable1

Observable<Integer> observable1 = Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {

                e.onNext(1);
                LogUtil.d("Emitter : 1");
                e.onNext(2);
                LogUtil.d("Emitter : 2");
                e.onComplete();
                LogUtil.d("onComplete1");
            }
        });

observable2

 Observable<Integer> observable2 = Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {

                e.onNext(3);
                LogUtil.d("Emitter : 3");
                e.onNext(4);
                LogUtil.d("Emitter : 4");
                e.onComplete();
                LogUtil.d("onComplete2");
            }
        });

subscribe

   Observable.concat(observable1, observable2)
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(@NonNull Integer integer) throws Exception {
                        LogUtil.d("onNext : " + integer + "\n");
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(@NonNull Throwable throwable) throws Exception {
                        LogUtil.d("Throwable");
                    }
                }, new Action() {
                    @Override
                    public void run() throws Exception {
                        LogUtil.d("onComplete");
                    }
                });

OK,那么我们首先运行一下,看下是什么结果…

 D/leo: onNext : 1
 D/leo: Emitter : 1
 D/leo: onNext : 2
 D/leo: Emitter : 2
 D/leo: onComplete1
 D/leo: onNext : 3
 D/leo: Emitter : 3
 D/leo: onNext : 4
 D/leo: Emitter : 4
 D/leo: onComplete2
 D/leo: onComplete

一切都很正常,如果我们把1中的onComplete取消掉呢?

Observable<Integer> observable1 = Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {

                e.onNext(1);
                LogUtil.d("Emitter : 1");
                e.onNext(2);
                LogUtil.d("Emitter : 2");
                  //e.onComplete();
                  // LogUtil.d("onComplete1");
            }
        });

结果是

 D/leo: onNext : 1
 D/leo: Emitter : 1
 D/leo: onNext : 2
 D/leo: Emitter : 2

结论:如果自定义Observable使用在Concat中,如果要想执行下一个Observable那么前一个Obeservable必须要执行onComplete方法

如果1中的onComplete放开,2中onComplete注释掉的话:

  Observable<Integer> observable2 = Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {

                e.onNext(3);
                LogUtil.d("Emitter : 3");
                e.onNext(4);
                LogUtil.d("Emitter : 4");
               // e.onComplete();
                //LogUtil.d("onComplete2");
            }
        });

结果是:

 D/leo: onNext : 1
 D/leo: Emitter : 1
 D/leo: onNext : 2
 D/leo: Emitter : 2
 D/leo: onComplete1
 D/leo: onNext : 3
 D/leo: Emitter : 3
 D/leo: onNext : 4
 D/leo: Emitter : 4

结论:concat中所有的Observable都要走完onComplete方法,不然 subscribe中的onComplete将不会执行

如果将1中的onComplete放在onNext(2)之前:

    Observable<Integer> observable1 = Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {

                e.onNext(1);
                LogUtil.d("Emitter : 1");
                e.onComplete();
                LogUtil.d("onComplete1");
                e.onNext(2);
                LogUtil.d("Emitter : 2");
            }
        });

结果是:

D/leo: onNext : 1
D/leo: Emitter : 1
D/leo: onComplete1
D/leo: Emitter : 2
D/leo: onNext : 3
D/leo: Emitter : 3
D/leo: onNext : 4
D/leo: Emitter : 4
D/leo: onComplete2
D/leo: onComplete

结论:自定义observable中 onComplete方法后的onNext会发送 但是subscribe并不会接受到.

我们把1,2中的onComplete之前加onError方法呢:

        1.      e.onNext(1);
                LogUtil.d("Emitter : 1");
                e.onNext(2);
                LogUtil.d("Emitter : 2");
                e.onError(new AndroidException("error"));
                LogUtil.d("error1");
                e.onComplete();
                LogUtil.d("onComplete1");

        2.      e.onNext(3);
                LogUtil.d("Emitter : 3");
                e.onNext(4);
                LogUtil.d("Emitter : 4");
                e.onError(new AndroidException("error"));
                LogUtil.d("error2");
                e.onComplete();
                LogUtil.d("onComplete2");

结果是:

 D/leo: onNext : 1
 D/leo: Emitter : 1
 D/leo: onNext : 2
 D/leo: Emitter : 2
 D/leo: error1
 D/leo: onComplete1
 D/leo: Throwable

结论:onError方法走后,后面的方法会发送 但是不会被subscribe接受 而后面的Observable将不会被执行

那如果把1中的onComplete放在onError之前呢 会发生什么:

                e.onNext(1);
                LogUtil.d("Emitter : 1");
                e.onNext(2);
                LogUtil.d("Emitter : 2");
                e.onComplete();
                LogUtil.d("onComplete1");
                e.onError(new AndroidException("error"));
                LogUtil.d("error1");

首选结果是:

 D/leo: onNext : 1
 D/leo: Emitter : 1
 D/leo: onNext : 2
 D/leo: Emitter : 2
 D/leo: onComplete1

但是同时APP直接崩溃了,并且报了一个错误

    io.reactivex.exceptions.UndeliverableException: android.util.AndroidException: error

这个错误在同时有两个onError也会报(这样的情况我之前遇到过,在接广告的时候 我在广告SDK返回adFailed方法中调用了onError),这个错误我暂时的理解是 onComplete执行后 自身的Observable不再有发送onError的能力 同时 OnError执行后不再有发送OnError的能力 就会报这个错误 如果有遇到这个错误 那么请检查自己Observable里面有没有这样的顺序.

暂时先写到这里,因为马上要吃饭了,12:00 ,写这个的目的只是为了做个记录顺便帮助到要了解这块的同志. 如果有错误的地方还请指出,我将及时修改 如果有没考虑到的地方 也请联系我让我写上去:QQ/WX:15921449923.

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值