1

我正在尝试使用 RxJava 进行改造的 https 请求

当网络不可用时,我想这样处理。1、查看网络状态。2,如果网络可用,重试请求 3,如果网络不可用,不重试 -> 之后,监听网络状态和什么时候回来,然后重试请求

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

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

4

2 回答 2

1

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

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

retryWhen下一节RxKotlin

RetryWhen当内部 observable 发出一个项目(调用 Observable 的 onNext 或 Single 的 onSuccess)或只是不重试并在onError我调用时将可抛出的下游传递时,运算符“重新订阅”。

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

retryWhen 运算符与 retry 类似,但通过将 onError 通知中的 Throwable 传递给生成第二个 Observable 的函数来决定是否重新订阅和镜像源 Observable,并观察其结果以确定要做什么。如果该结果是一个发出的项目,retryWhen 重新订阅并镜像源并重复该过程;如果该结果是 onError 通知,则 retryWhen 将此通知传递给其观察者并终止。

假设您有以下改造界面。

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>在本例中)。只要您在想要重试时发出项目而在不想重试时发出错误,通常使用哪种类型并不重要。

于 2019-11-25T09:14:00.417 回答
0

使用 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
    }
 }
}
于 2019-11-25T07:06:32.640 回答