RxJava在doOnNext内部失败时重试失败

时间:2017-01-27 18:03:46

标签: android rx-java2

AIM:当某些内容发生变化时刷新适配器,但仅在用户停止滚动列表时才刷新。

我试图在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());

更新的: someObservableSubject(总线),我正在观察UI事件。

请参阅下面的评论,因为看起来这里的retry()将无法达到预期的效果(即重试不会导致源自动重新发出最后一个值,除非我可能使用{ {1}} - 这里不合适。)

1 个答案:

答案 0 :(得分:0)

你没有提到emmited的价值。所以我只是把它作为这个例子的字符串。检查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());