Как вернуть значение ошибки и повторить с таймером - PullRequest
2 голосов
/ 08 ноября 2019

Я делаю сетевые запросы, и когда возникает ошибка, например, что Интернет отключен, он должен показывать пользователю ошибку, но повторять в фоновом режиме, чтобы, когда пользователь получает доступ к Интернету, он автоматически выбирал данные.

У меня есть следующий код, который возвращает ошибку после повторной попытки, но мне нужно немедленно вернуть ошибку, но я понятия не имею, как это сделать. Кто-нибудь может помочь? Заранее спасибо.

apiService.getForecastWeatherByLocation(latitude, longitude)
    .subscribeOn(Schedulers.io()).observeOn(Schedulers.io()).map { response ->
        if (response.isSuccessful) {
            Resource.success(
                transformForecastResponseToForecast(response.body())
            )
        } else {
            Resource.error(response.code(), response.message())
        }
    }
    .startWith(Resource.loading(null))
    .retryWhen { errors: Flowable<Throwable> ->
        errors.zipWith(
            Flowable.range(1, 3 + 1),
            BiFunction<Throwable, Int, Int> { error: Throwable, retryCount: Int ->
                if (retryCount > 3) {
                    throw error
                } else {
                    retryCount
                }
            }
        ).flatMap { retryCount: Int ->
            Flowable.timer(
                2.toDouble().pow(retryCount.toDouble()).toLong(),
                TimeUnit.SECONDS
            )
        }
    }.onErrorReturn {
        Resource.error(AppConstants.UNKNOWN_ERROR, it.localizedMessage ?: "")
    }

1 Ответ

0 голосов
/ 08 ноября 2019

Я не думаю, что в одном потоке можно достичь желаемого, так как поток закрывается после вызова onError (). Как насчет обходного пути?

val retryObservable = apiService.getForecastWeatherByLocation(...)
    .map { ... }
    .subscribeOn(...)
    .observeOn(...)
    .retryWhen(...)

apiService.getForecastWeatherByLocation(...)
    .map { ... }
    .subscribeOn(...)
    .observeOn(...)
    .startWith(...)
    .onErrorReturn {
        retryObservable.subscribe()
        Resource.error(...)
    }
    .subscribe()
...