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