在项目中根据返回结果判断是否需要重复操作,由于 repeatWhen()
无法在判断重复逻辑中拿到观测流,因此无法通过观察流判断是否重复(我不知道怎么获取,知道的朋友可以跟我说一下),可以使用 flatMap()
和 repeat()
操作符实现这个目的。
1. retry()
和retryWhen()
当onError()
回调时,触发重复订阅流程
2. repeat()
和repeatWhen()
当onCompleted()
回调时,触发重复订阅流程
下面是使用flatMap()
和repeat()
实现重订阅操作的例子,在flatMap()
中判断重复逻辑,如果符合重复条件则返回Observable.empty()
,此时会回调onCompleted()
从而触发重复操作
public class Repeat {
static final Logger logger = Logger.getLogger("Repeat ");
public static void main(String[] args){
Observable.range(0, 5)
.flatMap(new Func1<Integer, Observable<Integer>>() {
@Override
public Observable<Integer> call(Integer integer) {
if(integer == 5){
// 调用empty()时会回调onCompleted()
return Observable.empty();
}else {
return Observable.just(integer);
}
}
})
.repeat(2)
.doOnSubscribe(new Action0() {
@Override
public void call() {
logger.info("doOnSubscribe");
}
})
.subscribe(new Observer<Integer>() {
@Override
public void onCompleted() {
logger.info("onCompleted");
}
@Override
public void onError(Throwable throwable) {
logger.info("onError");
}
@Override
public void onNext(Integer integer) {
logger.info("onNext: " + integer);
}
});
}
}
结果如下:
十二月 09, 2018 3:56:31 下午 Repeat$2 call
信息: doOnSubscribe
十二月 09, 2018 3:56:32 下午 Repeat$1 onNext
信息: onNext: 0
十二月 09, 2018 3:56:32 下午 Repeat$1 onNext
信息: onNext: 1
十二月 09, 2018 3:56:32 下午 Repeat$1 onNext
信息: onNext: 2
十二月 09, 2018 3:56:32 下午 Repeat$1 onNext
信息: onNext: 3
十二月 09, 2018 3:56:32 下午 Repeat$1 onNext
信息: onNext: 4
十二月 09, 2018 3:56:32 下午 Repeat$1 onNext
信息: onNext: 0
十二月 09, 2018 3:56:32 下午 Repeat$1 onNext
信息: onNext: 1
十二月 09, 2018 3:56:32 下午 Repeat$1 onNext
信息: onNext: 2
十二月 09, 2018 3:56:32 下午 Repeat$1 onNext
信息: onNext: 3
十二月 09, 2018 3:56:32 下午 Repeat$1 onNext
信息: onNext: 4
十二月 09, 2018 3:56:32 下午 Repeat$1 onCompleted
信息: onCompleted
观察以上结果,每一次操作都会回调onNext()
,重复2次后才会回调onCompleted()