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

问题描述 投票:0回答:2

例如,我们有一些方法

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)
    }

如果没有连接重复呼叫每4-5秒,直到我们得到响应,最好和最简单的方法使用RX

android kotlin system.reactive rx-java2
2个回答
1
投票

你可以使用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)块中进行。


1
投票

为此,您可以使用它

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)
}
© www.soinside.com 2019 - 2024. All rights reserved.