【问题标题】:How to execute more than 3 parallel http requests using RxJava (+ retrofit2) on Android如何在 Android 上使用 RxJava (+ retrofit2) 执行 3 个以上的并行 http 请求
【发布时间】:2019-01-25 05:37:37
【问题描述】:

我正在尝试学习如何使用 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 &lt;*, *, *, *&gt;.的情况下

我已经尝试使用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 等混淆了...

如有错误请见谅

【问题讨论】:

标签: android kotlin rx-java retrofit2 reactivex


【解决方案1】:

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

如果您需要在获得更新后立即收到更新,我认为您最好的选择是将答案映射到常见类型,例如:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 2020-02-09
    • 2019-06-20
    • 1970-01-01
    相关资源
    最近更新 更多