我有一个Retrofit调用,并希望每30秒重新调用它。为此,我使用了Observable.interval(0, 30, TimeUnit.SECONDS)
Observable
.interval(0, 30, TimeUnit.SECONDS)
.flatMap(x -> RestApi.instance().getUsers())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(list -> {
// ...
},
error -> Timber.e(error, "can't load users"));
我的问题:如果API调用失败,将调用
onError
,并且订阅将取消订阅,轮询不再工作 :-(为了捕获API错误,我添加了一个
retryWhen
。Observable
.interval(0, 30, TimeUnit.SECONDS)
.flatMap(x -> RestApi.instance().getUsers()
.retryWhen(errors -> errors
.flatMap(error -> Observable.timer(15, TimeUnit.SECONDS))))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(list -> {
// ...
},
error -> Timber.e(error, "can't load users"));
这段代码可以捕获错误,但是我会在一段时间内收到多个API调用。每30秒,我会收到一个新的轮询信号,这会导致一个新的API请求。但是如果API请求失败,它会自动重试。因此,我会有一个新的请求加上所有的重试。
我的问题是:如何处理API错误而不取消订阅轮询信号?