如果没有连接,调用请求的最佳实践 - 每 4-5 秒重复调用一次,直到我们得到响应,使用 Rx

What best practice to call requests if no connection - repeat call every 4-5 seconds until we get response, use Rx

比如我们有一些方法

private fun getMobileData() {
        apiClient.getMobileData()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({ result ->
                datasBehavior.onNext(result.datas)
                actionsBehavior.onNext(result.actions)
            }) { it.message }.addTo(subscriptions)
    }

什么是最好和最简单的方法使用 RX 如果没有连接每 4-5 秒重复调用一次直到我们得到响应

为此你可以使用这个

source.retryWhen(errors -> errors.flatMap(error -> Observable.timer(5, TimeUnit.SECONDS)))

如果出现错误,retryWhen 代码将 运行,直到收到 onSuccess

在您的代码中,它类似于:

private fun getMobileData() {
    apiClient.getMobileData()
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .retryWhen(e -> e.flatMap(error -> Observable.timer(5, TimeUnit.SECONDS))
        .subscribe({ result ->
            datasBehavior.onNext(result.datas)
            actionsBehavior.onNext(result.actions)
        }) { it.message }.addTo(subscriptions)
}

你可以使用 retryWhen.

private fun getMobileData() {
    apiClient.getMobileData()
        .subscribeOn(Schedulers.io())
        .retryWhen { error -> 
            error.flatMap { Observable.timer(4, TimeUnit.SECONDS) }
        }
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe({ result ->
            datasBehavior.onNext(result.datas)
            actionsBehavior.onNext(result.actions)
        }) { it.message }.addTo(subscriptions)
}

如果你想检查错误是否完全是由没有连接引起的,你可以在 error.flatMap{} 块中进行,例如 if(it is NoConnectionException)