[RxJava]如何在Android RxJava×改造上通过"retryWhen()"处理网络错误2



我已经尝试了使用RxJava进行改造的https请求

当网络不可用时,我想这样处理。 1、检查网络状态。 2、如果网络可用,重试请求 3、如果网络不可用,则不重试 ->之后,侦听网络状态以及何时返回,然后重试请求

我认为我们应该使用retryWhen()运算符,但我不知道这样做很热

需要帮助才能有好的解决方案

你应该像你说的那样使用retryWhen运算符。

http://reactivex.io/documentation/operators/retry.html

请参阅RxKotlinretryWhen部分。

当内部可观察量发出一个项目(调用 Observable 的 onNext 或 Single's onSuccess 时,RetryWhen运算符会"重新订阅",或者只是在我调用时不重试并传递可抛onError的下游。

以上是我的措辞;文档中的确切措辞如下:

retryWhen 运算符类似于重试,但决定是否 通过传递 可从 onError 通知抛出到生成 第二个可观察,并观察其结果以确定要做什么。如果 该结果是发出的项目,重试时重新订阅并镜像 源和过程重复;如果该结果是错误 通知,重试时将此通知传递给其观察者 并终止。

假设您有以下改造接口。

interface Api {
@GET("/api")
fun request(): Single<String>
}

在重试块中,您将获得可抛出的可抛流(大部分HttpException从您的改造接口抛出(,您应该在此可流上使用flatMap运算符,因为当网络仍然不可用时,您必须通过可抛下游。

ApiClient.instance.request()
.retryWhen { flowable: Flowable<Throwable> ->
flowable.flatMap { throwable ->
// check network status here
if (available) return@flatMap Flowable.just<Boolean>(true)
return@flatMap Flowable.error<Boolean>(throwable)
}
}
.subscribe({ response -> /* deal with success */}, { error -> /* deal with error */})

请注意,您必须匹配重试案例和抛出案例的类型(在这种情况下Flowable<Boolean>(。通常,选择哪种类型并不重要,只要在要重试时发出项目,在不想重试时发出错误即可。

使用 rxJava 和 Retrofit 处理网络错误非常简单,因为它只是在 onError 方法中抛出一个 RetrofitError:

@Override
public void onError(Throwable e) {
if (e instanceof RetrofitError) {
if (((RetrofitError) e).isNetworkError()) {
//handle network error
} else {
//handle error message from server
}
}
}

相关内容

  • 没有找到相关文章

最新更新