Rxjava2操作符(三)

android大哥發表於2017-12-14

友情連結:
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
複製程式碼

相關文章