• Rx: как повторять подписку до определенного результата?

    Я не конечно не мастер Rx, но натолкнулся на эту статью на хабре Постигаем retryWhen и repeatWhen

    Кусок кода из статьи, применительный к вашей проблему
    public void load() {
        Observable.combineLatest(
                repository.getSomething()
                        .retryWhen(retryHandler ->
                                           retryHandler.flatMap(
                                                   err -> retrySubject.asObservable())),
                localStorage.fetchSomethingReallyHuge()
                        .retryWhen(retryHandler ->
                                           retryHandler.flatMap(
                                                   nothing -> retrySubject.asObservable())),
                (something, hugeObject) -> new Stuff(something, hugeObject))
                .subscribe(stuff -> {}, err -> {});
    }

    Прелесть такого подхода в том, что лямбда, переданная в оператор retryWhen() исполняется только после ошибки внутри источника, соответственно, если «ошибется» только один из источников, то и переподписка произойдет только на него, а оставшаяся цепочка ниже будет ожидать переисполнения.

    А если ошибка произойдет внутри обоих источников, то один и тот же retryHandler сработает в двух местах.
    Ответ написан
    Комментировать