Rxjava操作符入门(三)

错误处理型

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

猜你喜欢

转载自blog.csdn.net/qq_33408235/article/details/78782960