gpt4 book ai didi

java - 在 RxJava 中使用 onErrorReturn 和 retryWhen

转载 作者:行者123 更新时间:2023-12-02 09:27:55 24 4
gpt4 key购买 nike

这是代码:

import io.reactivex.Observable;
import io.reactivex.Observer;
import org.junit.jupiter.api.Test;

import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.atomic.AtomicBoolean;

public class RxJavaTest {

@Test
public void onErr() {

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(10) == 5) {
observer.onError(new Exception("don't retry..."));
} else {
observer.onError(new IllegalArgumentException("retry..."));
}
}
};
AtomicBoolean finished = new AtomicBoolean(false);
values1
.retryWhen(throwableObservable -> throwableObservable
.takeWhile(throwable -> {
boolean result = (throwable instanceof IllegalArgumentException);
if (result) {
System.out.println("Retry on error: " + throwable);
return result;
}
System.out.println("Error: " + throwable);
return result;
})
.take(20))
.onErrorReturn(throwable -> "Saved the day!")
.doOnTerminate(() -> finished.set(true))
.subscribe(v -> System.out.println(v));
}
}

目标是

  • 仅在出现 IllegalArgumentException 时重试,
  • 对于任何其他异常,立即返回(通过 onErrorReturn)。

上面的代码实现了第一个目标,但第二个目标失败了,它停止重试,但忽略了 .onErrorReturn 部分。

知道如何让它发挥作用吗?

最佳答案

您可以将 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);
}
})
)

为了使其重试,在 retryWhen 中返回哪个值并不重要(在上面的示例中返回 1)。根据 javadoc:

If that ObservableSource calls onComplete or onError then retry will call onComplete or onError on the child subscription. Otherwise, this ObservableSource will resubscribe to the source ObservableSource.

关于java - 在 RxJava 中使用 onErrorReturn 和 retryWhen,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58204510/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com