android - 如何在 Android 上使用 RxJava (+ retrofit2) 执行 3 个以上的并行 http 请求

标签 android kotlin rx-java retrofit2 reactivex

我正在尝试学习如何使用 RxJava ( io.reactivex.rxjava2:rxandroid:2.0.1 ) + retrofit2 + kotlin。

Observable是如何参与其中的,总的来说,想通了,甚至在Observable.zip的帮助下学会了如何根据所有的性能来组合2-3个并行查询的结果。 ,但是我无法理解如何以类似的方式执行 3 个以上的并行查询。

Observable 类的源代码有一个方法

static <T1, T2, T3, T4, R> Observable <R> zip (),

但它不像

static <T1, T2, T3, R> Observable <R> zip ()

在三个 Observable 输入和 Function3 <*, *, *, *>. 的情况下

我已经尝试使用 zip 进行前三个查询, 然后 flatMap等等,但它仍然不起作用。阅读文档和示例无助于转向正确的方向。我看着 Observable.combineLatest , 但得出的结论(可能是错误的)该方法将返回第一个被执行的 Observable 的结果。

我想要的:

我有 4 个返回 Observable 的方法:

  • this.orderRepository.getStatuses():可观察
  • this.orderRepository.getOrders():可观察
  • this.userRepository.getUsers():可观察
  • this.orderRepository.getTypes(): 可观察

请提示,我应该如何组合这些方法,使它们并行运行,最后将所有 4 个方法的结果集中在一个地方?

它已经搞砸了,但我通常不明白我应该用 4 个 Observable 做什么,以便它们都在一个地方并返回到 UI。 + 已经与 flatMap、map 等混淆了……

如有错误请多多包涵

最佳答案

您需要的是 zip,您遇到的问题可能是因为 zip 只会在所有 observable 都发出时发出。

如果您需要在收到更新后立即收到更新,我认为最好的办法是将答案映射到一个通用类型,例如:

class Response(val statuses: Statuses? = null, val orders: Orders? = null, val users: Users? = null, val types: Types? = null)

this.orderRepository.getStatuses().map(Response(statuses = it))

在对所有可观察对象执行此操作后,您将能够使用 concatmerge,它们会在任何可观察对象发出时立即发出。

更多信息:

http://www.introtorx.com/uat/content/v1.0.10621.0/12_CombiningSequences.html

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

https://code.i-harness.com/en/q/1bddcd2

关于android - 如何在 Android 上使用 RxJava (+ retrofit2) 执行 3 个以上的并行 http 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51907892/

相关文章:

android - 移动端如何检测邮件客户端: desktop or mobile,和平台?

android - 如何在 Android 中的 ImageView 上设置的 whatsapp 上共享图像

android - SearchView 编辑文本始终为空

java - Android中Base64文件上传IllegalArgument异常

android - 如何在AndroidUnitTest中获取应用程序

intellij-idea - 无法访问内置声明确保您对 Kotlin 标准库有依赖

android - 等待上一个事件完成 Rx

android - 在 Kotlin 中使用 okhttp 信任 HTTPS 证书时出错

java - 如何使用 RxJava 收集异步响应

java - RxJava 平面图 : How to skip errors?