Rxjava2中Concat操作符onNext,OnError,OnComplte的执行顺序
来源:互联网 发布:内存条js 编辑:程序博客网 时间:2024/06/02 09:01
本文只是通过例子,把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 : 1D/leo: Emitter : 1D/leo: onComplete1D/leo: Emitter : 2D/leo: onNext : 3D/leo: Emitter : 3D/leo: onNext : 4D/leo: Emitter : 4D/leo: onComplete2D/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.
阅读全文
0 0
- Rxjava2中Concat操作符onNext,OnError,OnComplte的执行顺序
- Rxjava1.x中在onNext()中抛出了异常,会执行onError()方法
- RxJava中的onNext onCompleted onError onStart() 在什么线程中被调用
- Observer Metodo:onNext, onCompleted, and onError
- rxjava onError,onNext,onCompleted 怎么理解;
- RxJava2 / RxJava2操作符scan
- RxJava2 / RxAndroid2的concat拼接多个Observable
- 数组中操作引用数据类型,执行顺序的bug记录
- rxjava2操作符
- RxJava2操作符Map
- RxJava 操作符 concat
- RxJava2.0中create操作符用法和源码分析
- RxJava2 中常用操作符和Subject常用子类说明
- 关于python的执行顺序和@操作符
- RxJava2 / RxAndroid2操作符take
- RxJava2 / RxAndroid2操作符skip
- RxJava2.0教程操作符
- Rxjava2.0 再探---操作符
- ifstream打印汉字乱码问题 UTF-8转GB2312
- C++动态内存管理
- 基于 Laradock 创建 Laravel 项目实例
- TensorFlow打印tensor值
- ARM汇编基础知识学习1(ARMV7 32位)
- Rxjava2中Concat操作符onNext,OnError,OnComplte的执行顺序
- Maven学习总结(41)——Maven依赖范围、传递、排除详解
- ubuntu16.04lts突然不能联网解决方法
- HDOJ2024C语言合法标识符
- USACO-Section2.2 Preface Numbering【暴力枚举】
- Android源码博文集锦2
- modelsim与debussy联调环境的搭建
- Round 1 G
- LintCode编程题汇总(更新中)