Как лучше всего выполнять запросы, если нет соединения - повторяйте вызов каждые 4-5 секунд, пока мы не получим ответ, используйте Rx - PullRequest
0 голосов
/ 22 марта 2019

Например, у нас есть несколько методов

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 секунд, пока мы не получим ответ

Ответы [ 2 ]

1 голос
/ 22 марта 2019

вы можете использовать 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 голос
/ 22 марта 2019

Для этой цели вы можете использовать этот

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