2 回答

TA貢獻(xiàn)1850條經(jīng)驗(yàn) 獲得超11個(gè)贊
您可以將其更改retryWhen為:
.retryWhen(throwableObservable ->
throwableObservable.flatMap(throwable -> {
if (throwable instanceof IllegalArgumentException) {
System.out.println("Retry on error: " + throwable);
return Observable.just(1);
} else {
System.out.println("Error: " + throwable);
return Observable.<Integer>error(throwable);
}
})
)
為了使其重試,返回哪個(gè)值并不重要retryWhen(在上面的示例中返回 1)。根據(jù)javadoc:
如果 ObservableSource 調(diào)用 onComplete 或 onError,則重試將在子訂閱上調(diào)用 onComplete 或 onError。否則,此 ObservableSource 將重新訂閱源 ObservableSource。

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超7個(gè)贊
作為記錄,這是我在看到古斯塔沃的答案之前使用的解決方案onErrorResumeNext:
private Observable<String> createObservable(long delay) {
Observable<String> values1 = new Observable<String>() {
@Override
protected void subscribeActual(Observer<? super String> observer) {
observer.onNext("New");
observer.onNext("New1");
observer.onNext("New2");
observer.onNext("New3");
observer.onNext("New4");
if (ThreadLocalRandom
.current()
.nextInt(8) == 2) {
observer.onError(new RuntimeException("don't retry..."));
} else {
observer.onError(new IllegalArgumentException("retry..."));
}
}
};
return Observable.timer(delay, TimeUnit.SECONDS).flatMap(aLong -> values1)
.onErrorResumeNext((Throwable throwable) -> {
if (throwable instanceof IllegalArgumentException) {
return createObservable(delay + 2);
} else {
return Observable.just("The default value");
}
});
}
這按預(yù)期工作,但我認(rèn)為古斯塔沃建議的方式更容易理解。這是使用以下重寫的相同函數(shù)retryWhen:
private Observable<String> createObservable1() {
Observable<String> values1 = new Observable<String>() {
@Override
protected void subscribeActual(Observer<? super String> observer) {
observer.onNext("New");
observer.onNext("New1");
observer.onNext("New2");
observer.onNext("New3");
observer.onNext("New4");
if (ThreadLocalRandom
.current()
.nextInt(3) == 1) {
observer.onError(new RuntimeException("don't retry..."));
} else {
observer.onError(new IllegalArgumentException("retry..."));
}
}
};
return values1.retryWhen(throwableObservable ->
throwableObservable
.zipWith(Observable.range(1, 5), (throwable, integer) -> {
if (throwable instanceof IllegalArgumentException) {
System.out.println("Retry on error: " + throwable);
return integer;
}
System.out.println("No retry on error: " + throwable);
return -1;
})
.flatMap(integer -> {
if (integer > 0) {
System.out.println("Delay " + integer + " sec on retry...");
return Observable.timer(integer, TimeUnit.SECONDS);
}
System.out.println("Return immediately...");
return Observable.error(new Exception());
})
).onErrorReturnItem("Saved the day!");
}
希望這可以幫助。
添加回答
舉報(bào)