2017-01-27 7 views
1

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 Здесь не подходит.

ответ

0

Вы не указали, какое значение присвоено. Поэтому я просто сделаю строку для этого примера. Проверка состояния прокрутки внутри doOnNext слишком поздняя, ​​так как они не могут быть распространены назад для retryWhen. Вы можете просто использовать flatMap, чтобы выбросить ошибку.

Observable.just("someValue") 
     .observeOn(AndroidSchedulers.mainThread()) 
     .debounce(650, TimeUnit.MILLISECONDS) 
     .flatMap((Func1<String, Observable<?>>) s -> { 
      if (isListScrolling()) { 
       // Still scrolling, pass error so we can retry in the next step 
       return Observable.error(new Exception()); 
      } 

      // Not scrolling, we can continue 
      return Observable.just("someValue"); 
     }) 
     .retry() 
     .subscribe(o -> refreshListNow()); 
+0

Я пробовал вариант выше, однако теперь код в 'retryWhen', кажется, срабатывает, даже если нет ошибки, и тогда подписка, кажется, полностью вымирает. – strangetimes

+0

Я должен добавить, что «наблюдаемый» - это предмет (автобус) ... возможно, это меняет вещи? – strangetimes

+0

две незначительные вещи - 'Observable.just (null)' не будут работать в RxJava 2, и я бы использовал '.map' вместо' .flatMap'. субъект может изменить ситуацию - цитируя [страницу проекта RxRelay] (https://github.com/JakeWharton/RxRelay): «Субъекты полезны для преодоления разрыва между API-интерфейсами, отличными от Rx. Однако они являются уязвимыми с точки зрения состояния: когда они получают onComplete или onError, они больше не становятся пригодными для перемещения данных. Это наблюдаемый контракт, и иногда это желаемое поведение. В большинстве случаев это не так ». – ahmedre