RxJava-retryWhen-propagate retry-obervable错误
我正在努力理解RxJava-retryWhen-propagate retry-obervable错误,java,rx-java,Java,Rx Java,我正在努力理解retryWhen 我的用例如下所示: 我有一个主要的观察到的 如果发生错误,我希望执行 不同的可观察到的(也有不同的结果) 如果第二次观测成功,我想重新执行原始观测 可观察一次(如果在第一次重试期间发生错误,我不希望再次重试) 如果第二次观测不成功,我想传播 对主要可观察对象的订户的错误 我该怎么做 已经谢谢你了 更新 到目前为止,我尝试的是: public class RetryTest { private int i = 0; @Test public
retryWhen
我的用例如下所示:
- 我有一个主要的观察到的
- 如果发生错误,我希望执行 不同的可观察到的(也有不同的结果)
- 如果第二次观测成功,我想重新执行原始观测 可观察一次(如果在第一次重试期间发生错误,我不希望再次重试)
- 如果第二次观测不成功,我想传播 对主要可观察对象的订户的错误
更新
到目前为止,我尝试的是:
public class RetryTest {
private int i = 0;
@Test
public void testRetry() {
Observable
.create((Observable.OnSubscribe<String>) subscriber -> {
if (i == 0) {
i++;
throw new RuntimeException("Main error");
} else {
subscriber.onNext("Main success");
subscriber.onCompleted();
}
})
.retryWhen(observable -> {
// HERE IS WHERE I NEED HELP, i need something like:
Observable.just("Error handling observable")
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
// Do retry ONCE
}
@Override
public void onError(Throwable e) {
// Propagate error
}
@Override
public void onNext(String s) {
// Nothing to do here
}
});
})
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
System.out.println("onCompleted");
}
@Override
public void onError(Throwable e) {
System.out.println("onError: " + e);
}
@Override
public void onNext(String s) {
System.out.println("onNext: " + s);
}
});
}
}
公共类RetryTest{
私有整数i=0;
@试验
公共void testRetry(){
可观察
.create((Observable.OnSubscribe)订户->{
如果(i==0){
i++;
抛出新的运行时异常(“主错误”);
}否则{
认购人.onNext(“主要成功”);
subscriber.onCompleted();
}
})
.retryWhen(可观察->{
//这里是我需要帮助的地方,我需要一些类似的东西:
可观察的。只是(“可观察的错误处理”)
.subscribe(新订户(){
@凌驾
未完成的公共无效(){
//请重试一次
}
@凌驾
公共无效申报人(可丢弃的e){
//传播错误
}
@凌驾
public void onNext(字符串s){
//这里没什么可做的
}
});
})
.subscribe(新订户(){
@凌驾
未完成的公共无效(){
System.out.println(“未完成”);
}
@凌驾
公共无效申报人(可丢弃的e){
System.out.println(“onError:+e”);
}
@凌驾
public void onNext(字符串s){
System.out.println(“onNext:+s”);
}
});
}
}
有更简单的解决方案。在您的情况下,您不需要使用retryWhen
运算符,而是使用onErrorResumeNext
:
Observable mainObservable = Observable.just("Your main Observable");
Observable secondObservable = Observable.just("Your second Observable");
mainObservable
.onErrorResumeNext(o1 -> secondObservable.flatMap(o2 -> mainObservable))
.subscribe();
在这里,onErrorResumeNext
截取一个错误并执行第二个可观察到的,然后是主可观察到的。如果会有错误
-它将向下游传播。所有这些都符合您的标准。您已经尝试过什么?(我的意思是,请分享一个简单的例子来证明这一点,并描述你在这方面遇到的问题)添加了一个例子,说明我尝试了什么以及我遇到了什么困难。出于好奇:是否有一种像
onErrorResumeNext
这样的方法将原始的可观测值作为参数?我想在一个单独的类/方法中具体化它,而不需要传入原始的observable