【问题标题】:[RxJava]How to handle network error by `retryWhen()` on Android RxJava × retrofit2[RxJava]如何在Android RxJava×retrofit2上通过`retryWhen()`处理网络错误
【发布时间】:2019-11-25 06:55:46
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android kotlin rx-java retrofit2 retrywhen


    【解决方案1】:

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

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

    参见RxKotlinretryWhen 部分。

    RetryWhen 操作符“重新订阅”当内部 observable 发出一个项目(调用 Observable 的 onNext 或 Single 的 onSuccess)或者当我调用onError 时不重试并将 throwable 传递给下游。

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

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

    假设你有如下改造界面。

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

    在重试块中,你会得到一个 throwable 的 flowable(主要是从你的改造界面抛出的 HttpException),你应该在这个 flowable 上使用 flatMap 操作符,因为当网络连接时你必须将 throwable 传递到下游仍然不可用。

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

    【讨论】:

    • 谢谢!我可以像你说的那样处理!
    【解决方案2】:

    使用 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
        }
     }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-01-20
      • 1970-01-01
      • 2019-03-16
      • 2017-05-13
      • 2016-06-29
      • 1970-01-01
      • 2019-02-27
      • 2015-03-06
      • 1970-01-01
      相关资源
      最近更新 更多