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());
更新的:
someObservable
是Subject
(总线),我正在观察UI事件。
请参阅下面的评论,因为看起来这里的retry()
将无法达到预期的效果(即重试不会导致源自动重新发出最后一个值,除非我可能使用{ {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());