【问题标题】:Handle errors with Zip operator, Rxjava2 and Retrofit使用 Zip 运算符、Rxjava 和 Retrofit 处理错误
【发布时间】:2021-05-11 13:51:50
【问题描述】:

所以我有这两个使用 zip 运算符的并行调用。我正在拨打两个网络电话。我有以下问题:

  1. 如何正确处理个别错误
  2. 如果第一次调用失败,我希望能够退出会话,但如果第二次网络调用失败,我希望允许用户继续进行会话。我在 zip 中的第二个网络调用中看到 404,整个链因错误而失败。我希望它能够处理成功和失败

有效会话 回应1:成功 回应2:失败

无效会话 回应1:失败 响应 2:成功

无效会话 两个端点都失败了

Single.zip(
api1.getData().doOnError {
    // handle error : exit right away
},
api2.getData().doOnError {
  // handle error: Set profile data to be empty but when user tries to see the profile information show error at a later point in time based oaths response
 // got 404 
},
{ response1: String, response2: CustomObject ->
    Pair(response1, response2)
}
)
.subscribeOn(Schedulers.io())
.subscribe(
    {
        handleResponse1(it.first)
       handleRespone2(it.second)
    },
    {
        Timber.d("it : $it")
       // api1 use success response: is it even possibel to get that in the iterator 
       // api 2 throwing 404 here 
    }
)

【问题讨论】:

    标签: android kotlin retrofit rx-java2 zip-operator


    【解决方案1】:

    从您的问题中,我看到您想要继续,即使其中一个 API 失败而不使整个链失败。这可以通过以下方式完成

    • 如果您想在第一次 API 调用时退出,则无需在那里处理任何错误。(您将在 throwable 中收到错误)

    • 每当第二个 API 失败时,使用 onErrorReturnItem 返回一些空响应

      Single.zip(
            api1.getData().subscribeOn(Schedulers.io()),
        api2.getData().subscribeOn(Schedulers.io())
                    .onErrorReturnItem(new Response())
        .......
      

    这里的new Response() 只是您期望的响应类型的空对象。即使第二个 API 在这里失败,你也会得到你要返回的任何东西

    如果第一个 API 在此处失败,您将在 Throwable 中获得回调,或者您可以继续处理 doOnError 中的错误

    【讨论】:

      猜你喜欢
      • 2016-02-17
      • 2017-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-23
      相关资源
      最近更新 更多