友情链接:
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