RxJava + Retrofit +民意调查

Ral*_*ann 11 java android rx-java rx-android retrofit2

我有一个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"));
Run Code Online (Sandbox Code Playgroud)

我的问题:如果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"));
Run Code Online (Sandbox Code Playgroud)

这会捕获错误但我会在一段时间内收到多个api调用.每30秒我得到一个新的轮询信号,它以新的api请求结束.但是如果api请求失败,它会自行重试.所以我有一个新请求加上所有重试.

我的问题:如何在不取消订阅轮询信号的情况下处理api错误?

raf*_*kob 11

阅读如何正确使用retryWhenrepeatWhen. http://blog.danlew.net/2016/01/25/rxjavas-repeatwhen-and-retrywhen-explained/

以及如何使用onError运营商:http: //blog.danlew.net/2015/12/08/error-handling-in-rxjava/

这真的很容易Rx :)我不会给你一个最终的解决方案,只是玩它并尝试理解这里的流程.