Rxjava2操作符(三)

友情链接:
Rxjava2操作符(一)
Rxjava2操作符(二)
Rxjava2操作符(三)
demo地址:github

错误处理型

retry: 当原始Observable在遇到错误时进行重试。如果重复过后还是错误,就崩溃

 Observable.just(1, "2", 3)
                        .cast(Integer.class)
                        .retry(3)
                        .subscribe(new Consumer<Integer>() {
                            @Override
                            public void accept(Integer integer) throws Exception {
                                Log.i(TAG, "retry重试数据"+integer);
                            }
                        });
复制代码

打印出来 4个1 之后崩溃

12-12 06:04:41.890 10380-10380/niezhiyang.cn.rxjava2_android_samples I/ErrorHandlingActivity: retry重试数据1
12-12 06:04:41.890 10380-10380/niezhiyang.cn.rxjava2_android_samples I/ErrorHandlingActivity: retry重试数据1
12-12 06:04:41.891 10380-10380/niezhiyang.cn.rxjava2_android_samples I/ErrorHandlingActivity: retry重试数据1
12-12 06:04:41.891 10380-10380/niezhiyang.cn.rxjava2_android_samples I/ErrorHandlingActivity: retry重试数据1
12-12 06:04:41.892 10380-10380/niezhiyang.cn.rxjava2_android_samples W/System.err:     at niezhiyang.cn.rxjava2_android_samples.ErrorHandlingActivity.onViewClicked(ErrorHandlingActivity.java:32)
复制代码

retryWhen 当原始Observable在遇到错误,将错误传递给另一个Observable来决定是否要重新订阅这个Observable

  Observable.just(1, "2", 3)
                        .cast(Integer.class)
                        .retryWhen(new Function<Observable<Throwable>, ObservableSource<Integer>>() {
                            @Override
                            public ObservableSource<Integer> apply(Observable<Throwable> throwableObservable) throws Exception {
                                return Observable.just(4,5);
                            }
                        })
                        .subscribe(new Consumer<Integer>() {
                            @Override
                            public void accept(Integer integer) throws Exception {
                                Log.i(TAG, "retryWhen重试数据"+integer);
                            }
                        });
复制代码

打印出来 两个1

12-12 06:08:08.150 10487-10487/niezhiyang.cn.rxjava2_android_samples I/ErrorHandlingActivity: retryWhen重试数据1
12-12 06:08:08.150 10487-10487/niezhiyang.cn.rxjava2_android_samples I/ErrorHandlingActivity: retryWhen重试数据1
复制代码

onErrorReturn 当原始Observable在遇到错误时发射一个特定的数据

  Observable.just(1,"2",3)
                        .cast(Integer.class)
                        .onErrorReturn(new Function<Throwable, Integer>() {
                            @Override
                            public Integer apply(Throwable throwable) throws Exception {
                                return 0;
                            }
                        }).subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.i(TAG, "onErrorReturn 出现错误之后的默认数据"+integer);
                    }
                });
复制代码

打印出来的是: 1.0

12-12 06:10:45.547 10487-10487/niezhiyang.cn.rxjava2_android_samples I/ErrorHandlingActivity: onErrorReturn 出现错误之后的默认数据1
12-12 06:10:45.547 10487-10487/niezhiyang.cn.rxjava2_android_samples I/ErrorHandlingActivity: onErrorReturn 出现错误之后的默认数据0
复制代码

onErrorResumeNext 当遇到错误的时候,会返回一个新的Observable

  • 使用场景: 当请求数据的时候,假如token无效的话,也就是http返回码是401的时候,可以用这个重新请求token接口之后再请求数据

辅助型

doOnNext 让订阅者在接收到数据做一些事情。假如我们在获取到数据之前想先保存一下它

 Observable.just(1, 2, 3).doOnNext(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.i(TAG, "doOnNext接受之前:" + integer);
                    }
                }).subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.i(TAG, "doOnNext接受到的数据:" + integer);
                    }
                });
复制代码

打印的是:

12-12 06:30:36.749 11324-11324/niezhiyang.cn.rxjava2_android_samples I/UtilityActivity: doOnNext接受之前:1
12-12 06:30:36.750 11324-11324/niezhiyang.cn.rxjava2_android_samples I/UtilityActivity: doOnNext接受到的数据:1
12-12 06:30:36.750 11324-11324/niezhiyang.cn.rxjava2_android_samples I/UtilityActivity: doOnNext接受之前:2
12-12 06:30:36.750 11324-11324/niezhiyang.cn.rxjava2_android_samples I/UtilityActivity: doOnNext接受到的数据:2
12-12 06:30:36.750 11324-11324/niezhiyang.cn.rxjava2_android_samples I/UtilityActivity: doOnNext接受之前:3
12-12 06:30:36.750 11324-11324/niezhiyang.cn.rxjava2_android_samples I/UtilityActivity: doOnNext接受到的数据:3
复制代码

doAfterNext 顾名思义 跟doOnNext相反 实在收到数据之后的操作

  Observable.just(1, 2, 3).doAfterNext(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.i(TAG, "doAfterNext接受之后:" + integer);
                    }
                }).subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.i(TAG, "doAfterNext接受到的数据:" + integer);
                    }
                });
复制代码

打印的是:

6:31:38.773 11324-11324/niezhiyang.cn.rxjava2_android_samples I/UtilityActivity: doAfterNext接受到的数据:1
12-12 06:31:38.773 11324-11324/niezhiyang.cn.rxjava2_android_samples I/UtilityActivity: doAfterNext接受之后:1
12-12 06:31:38.773 11324-11324/niezhiyang.cn.rxjava2_android_samples I/UtilityActivity: doAfterNext接受到的数据:2
12-12 06:31:38.773 11324-11324/niezhiyang.cn.rxjava2_android_samples I/UtilityActivity: doAfterNext接受之后:2
12-12 06:31:38.773 11324-11324/niezhiyang.cn.rxjava2_android_samples I/UtilityActivity: doAfterNext接受到的数据:3
12-12 06:31:38.773 11324-11324/niezhiyang.cn.rxjava2_android_samples I/UtilityActivity: doAfterNext接受之后:3
复制代码

doAfterNext 顾名思义 跟doOnNext相反 实在收到数据之后的操作

  Observable.just(1, 2, 3).doOnComplete(new Action() {
                    @Override
                    public void run() throws Exception {
                        Log.i(TAG, "最终的操作");
                    }
                }).subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.i(TAG, "doOnComplete接受到的数据:" + integer);
                    }
                });
复制代码

打印的是:

12-12 06:32:40.045 11324-11324/niezhiyang.cn.rxjava2_android_samples I/UtilityActivity: doOnComplete接受到的数据:1
12-12 06:32:40.045 11324-11324/niezhiyang.cn.rxjava2_android_samples I/UtilityActivity: doOnComplete接受到的数据:2
12-12 06:32:40.045 11324-11324/niezhiyang.cn.rxjava2_android_samples I/UtilityActivity: doOnComplete接受到的数据:3
12-12 06:32:40.045 11324-11324/niezhiyang.cn.rxjava2_android_samples I/UtilityActivity: 最终的操作
复制代码

条件和布尔

all 把发射过来的所有数据,看看每一个是否满足条件,之后传递过去一个boolean值

 Observable.just(1,2,3)
                        .all(new Predicate<Integer>() {
                            @Override
                            public boolean test(Integer integer) throws Exception {
                                return integer>2;
                            }
                        })
                        .subscribe(new BiConsumer<Boolean, Throwable>() {
                            @Override
                            public void accept(Boolean aBoolean, Throwable throwable) throws Exception {
                                Log.i(TAG, "all-->:" + aBoolean);
                            }
                        });
复制代码

打印的是

12-12 06:58:57.958 12153-12153/niezhiyang.cn.rxjava2_android_samples I/ConditionalandBooleanActivity: all-->:false
复制代码

contains 判断发射过来的数据是否包含某个数据,只要有一个就返回true

  Observable.just(1,2,3)
                        .contains(3)
                        .subscribe(new BiConsumer<Boolean, Throwable>() {
                            @Override
                            public void accept(Boolean aBoolean, Throwable throwable) throws Exception {
                                Log.i(TAG, "contains-->:" + aBoolean);
                            }
                        });
复制代码

打印的是

12-12 06:59:03.123 12153-12153/niezhiyang.cn.rxjava2_android_samples I/ConditionalandBooleanActivity: contains-->:true
复制代码

contains 判断发射过来的数据是否包含某个数据,只要有一个就返回true

  Observable.just(1,2,3)
                        .contains(3)
                        .subscribe(new BiConsumer<Boolean, Throwable>() {
                            @Override
                            public void accept(Boolean aBoolean, Throwable throwable) throws Exception {
                                Log.i(TAG, "contains-->:" + aBoolean);
                            }
                        });
复制代码

打印的是

12-12 06:59:03.123 12153-12153/niezhiyang.cn.rxjava2_android_samples I/ConditionalandBooleanActivity: contains-->:true
复制代码

isEmpty 判断是否有数据发送过来,如果有就是false 如果只发射了OnComplete就会返回true

  Observable.just(1,2,3)
                        .isEmpty()
                        .subscribe(new Consumer<Boolean>() {
                            @Override
                            public void accept(Boolean aBoolean) throws Exception {
                                Log.i(TAG, "isEmpty -->:" + aBoolean);
                            }
                        });
复制代码

打印的是

12-12 07:03:42.007 12390-12390/niezhiyang.cn.rxjava2_android_samples I/ConditionalandBooleanActivity: isEmpty -->:false
复制代码

takeUntil 发射的数据满足某个条件之后的就会终止发送

  Observable.just(1,2,3)
                        .takeUntil(new Predicate<Integer>() {
                            @Override
                            public boolean test(Integer integer) throws Exception {
                                return integer>1;
                            }
                        })
                        .subscribe(new Consumer<Integer>() {
                            @Override
                            public void accept(Integer integer) throws Exception {
                                Log.i(TAG, "takeUntil -->:" + integer);
                            }
                        });
复制代码

打印的是

12-12 07:13:47.657 12964-12964/niezhiyang.cn.rxjava2_android_samples I/ConditionalandBooleanActivity: takeUntil -->:1
12-12 07:13:47.657 12964-12964/niezhiyang.cn.rxjava2_android_samples I/ConditionalandBooleanActivity: takeUntil -->:2
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值