【发布时间】:2018-01-31 05:04:49
【问题描述】:
在一个Android应用场景中,我想从网络中获取一些Observable<Data>,并且有多个Observer<Data>订阅它以更新相应的视图。如果出现错误 - 说超时 - 向用户显示一个按钮以重试。
如何进行重试部分?我可以告诉 observable 在不重新订阅的情况下再次重新执行其逻辑吗?
【问题讨论】:
标签: android rx-java2 rx-android
在一个Android应用场景中,我想从网络中获取一些Observable<Data>,并且有多个Observer<Data>订阅它以更新相应的视图。如果出现错误 - 说超时 - 向用户显示一个按钮以重试。
如何进行重试部分?我可以告诉 observable 在不重新订阅的情况下再次重新执行其逻辑吗?
【问题讨论】:
标签: android rx-java2 rx-android
假设您有两个按钮,“重试”和“取消”,最初是隐藏的。创建两个Observables retryButtonClicks 和cancelButtonClicks。然后,将retryWhen 运算符应用于指定的下载流,并根据这些按钮点击的信号进行操作:
download.retryWhen(errors -> {
return errors
.observeOn(AndroidSchedulers.mainThread())
.flatMap(e -> {
// show the "Retry" and "Cancel" buttons around here
return Observable.amb(
retryButtonClicks.take(1).map(v -> "Retry"),
cancelButtonClicks.take(1).map(v -> "Cancel")
)
.doOnNext(v -> { /* hide the "Retry" and "Cancel" buttons */ });
})
.takeWhile(v -> "Retry".equals(v))
;
});
【讨论】:
retryWhen 存在一系列错误。如果发生错误,则映射另一个流,其中从任一按钮获取按钮单击信号,除非单击取消。单击“重试”按钮后,retryWhen 将重新订阅源。请查看用于创建按钮的 RxBinding 库单击Observables。
retryWhen 可以防止错误传播到观察者的onError 回调。使用retryWhen时如何解决这个问题?
【讨论】: