Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RxJava-retryWhen-propagate retry-obervable错误_Java_Rx Java - Fatal编程技术网

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