AIM: Обновите адаптер, если что-то изменится, но только когда пользователь остановил прокрутку списка.RxJava повторить попытку, сброшенную внутри doOnNext
Я пытаюсь выбросить ошибку в doOnNext
, чтобы затем я мог подождать и снова повторить попытку. Однако это не работает. Я вижу, что исключение выбрасывается, но retryWhen
, похоже, ничего не делает.
Что я здесь делаю неправильно?
someObservable()
.observeOn(AndroidSchedulers.mainThread())
.debounce(650, TimeUnit.MILLISECONDS)
.doOnNext(o -> {
if (isListScrolling()) {
throw new IllegalStateException();
}
})
.retryWhen(errors -> errors.flatMap(error -> Observable.timer(100, TimeUnit.MILLISECONDS)))
.subscribe(o -> refreshListNow());
UPDATE: someObservable
является Subject
(автобус), что я наблюдая события пользовательского интерфейса на.
См. Мой комментарий ниже, как кажется retry()
здесь не будет работать, как можно было бы ожидать (т. Е. Повторение не приводит к тому, что источник автоматически переизлучает последнее значение, если только я, возможно, не использовал BehaviorSubject
- который isn Здесь не подходит.
Я пробовал вариант выше, однако теперь код в 'retryWhen', кажется, срабатывает, даже если нет ошибки, и тогда подписка, кажется, полностью вымирает. – strangetimes
Я должен добавить, что «наблюдаемый» - это предмет (автобус) ... возможно, это меняет вещи? – strangetimes
две незначительные вещи - 'Observable.just (null)' не будут работать в RxJava 2, и я бы использовал '.map' вместо' .flatMap'. субъект может изменить ситуацию - цитируя [страницу проекта RxRelay] (https://github.com/JakeWharton/RxRelay): «Субъекты полезны для преодоления разрыва между API-интерфейсами, отличными от Rx. Однако они являются уязвимыми с точки зрения состояния: когда они получают onComplete или onError, они больше не становятся пригодными для перемещения данных. Это наблюдаемый контракт, и иногда это желаемое поведение. В большинстве случаев это не так ». – ahmedre