使用 Zip 运算符、Rxjava 和 Retrofit 处理错误

Posted

技术标签:

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

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

    如何正确处理个别错误 如果第一次调用失败,我希望能够退出会话,但如果第二次网络调用失败,我希望允许用户继续进行会话。我在 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 
    
)

【问题讨论】:

【参考方案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 中的错误

【讨论】:

以上是关于使用 Zip 运算符、Rxjava 和 Retrofit 处理错误的主要内容,如果未能解决你的问题,请参考以下文章

Rxjava并行执行耗时操作使用zip和merge

Rxjava并行执行耗时操作使用zip和merge

Rxjava + Retrofit 你需要掌握的几个经典技巧

android Retrofig RxJava写法基于Kotlin在优化

java rxjava zip样本

RxJava zip鎿嶄綔绗﹀湪Android涓殑瀹為檯浣跨敤鍦烘櫙