2016-10-24 4 views
3

Как обновить источник, наблюдаемый при повторном запуске?Изменить источник, наблюдаемый при повторной попытке - RxJava

List<String> ids = new ArrayList<>(); // A,B,C 
Observable.from(ids) 
      .retryWhen(errors -> { 
        return errors 
        .zipWith(Observable.range(0, 1), (n, i) -> i) 
        .flatMap(retryCount -> Observable.timer((long) Math.pow(2, retryCount), TimeUnit.MINUTES)); 

      }) 
      .subscribe(....); 

сейчас вместо передачи // A, B, C как идентификаторы, если я хочу передать некоторые другие значения. Как мне это сделать? или это даже правильный подход?

ответ

1

Использование defer. Это позволит ids быть повторно вычислено:

Observable.defer(() -> { 
    List<String> ids = // compute this somehow 
    return Observable.from(ids); 
}).retryWhen(... 

Documentation on the defer operator

+0

У меня только один абонент. Отсрочка создает новый наблюдаемый для каждого наблюдателя. вы не думаете, что onErrorResumeNext - лучший вариант? – Bharath

+0

Не могли бы вы пояснить, что вы имеете в виду? Сам обратный вызов подписки является наблюдателем - он получает входящие элементы из восходящего потока. Следовательно, термин «наблюдаемый» для вещи, которую вы наблюдаете, - это производство предметов, которые могут наблюдаться наблюдателем. Несколько наблюдателей могут означать, что вы многоадресный, что в этом примере вы не. – drhr

+0

Я понял. спасибо, что помог мне понять. – Bharath

1

onErrorResumeNext могут быть использованы. Вероятно, вам нужна дополнительная логика для соответствия вашему варианту использования. Документация для операторов обработки ошибок here.

List<String> ids = new ArrayList<>(); // A,B,C 
List<String> ids2 = new ArrayList<>(); // D,E,F 
Observable.from(ids) 
     .onErrorResumeNext(throwable -> { 
      return Observable.from(ids2); 
     }); 
+0

onErrorResumeNext вызывается, когда retryWhen таймер истекает? – Bharath

+0

Ну, в настоящее время он будет называться сразу после того, как ошибка будет испускана из первого наблюдаемого, вам придется добавить логику таймера самостоятельно. – ehehhh

+0

У меня уже есть логика таймера в retryWhen. Но, я полагаю, что логика таймера должна быть частью onErrorResumeNext? – Bharath

Смежные вопросы