RxJava - retryWhen - распространить наблюдаемую ошибку повтора

Я изо всех сил пытаюсь понять 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);
                  }
              });
  }
}

person JDC    schedule 05.12.2016    source источник
comment
Что вы уже пробовали? (Я имею в виду, пожалуйста, поделитесь минимальным примером, демонстрирующим это, и опишите проблемы, с которыми вы столкнулись)   -  person Ivan    schedule 05.12.2016
comment
Добавлен пример того, что я пробовал и где я застрял.   -  person JDC    schedule 06.12.2016


Ответы (1)


Есть более простое решение. В вашем случае вам не нужен оператор 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 перехватывает ошибку и выполняет второй Observable, затем основной Observable. Если будет ошибка - она ​​распространится вниз по течению. Все соответствует вашим критериям.

person Maksim Ostrovidov    schedule 05.12.2016
comment
Из любопытства: есть ли такой метод, как onErrorResumeNext, который имеет исходный наблюдаемый параметр? Я хотел бы вынести это в отдельный класс/метод без необходимости передавать исходный наблюдаемый объект. - person JDC; 06.12.2016
comment
Вы можете использовать compose() - person Daniele Segato; 06.12.2016