使用 RX And​​roid 进行并行 API 调用

Posted

技术标签:

【中文标题】使用 RX And​​roid 进行并行 API 调用【英文标题】:make parallel API calls using RX Android 【发布时间】:2021-05-01 02:53:04 【问题描述】:

我有两个不同的端点用于为用户获取数据。我正在使用 RX 适配器工厂进行改造。如果我按顺序调用单个方法内的两个端点,它是否被认为是在两个不同线程上执行的并行调用。如果不是,我如何使用 RX 使这些 API 调用并行?或者一种在并行获取数据的同时获得响应的方法。例如,第一个端点可能需要 5 秒,而第二个端点可能需要 7 秒,但结束响应将在 7 秒后可用。

fun fetchData() 
    api.getData()
        .subscribeOn(Schedulers.io())
        .subscribe(
             profileResponse ->
                //ProfileResponse Object
                Timber.d("profileResponse: $profileResponse")
                //store response for later use
                Cache.save("key", profileResponse.toString())
            ,
            
                Timber.e("error")
            
        )


    api2.getData()
        .subscribeOn(Schedulers.io())
        .subscribe(
             profileDetails ->
                //profileDetails Object
                Timber.d("profileDetails: $profileDetails")
            ,
            
                Timber.e("error")
            
        )

【问题讨论】:

据我所知(不要将此作为答案),但在我看来,我相信您正在做的事情将并行执行它们。据我了解,Scheduler.IO 是一个线程池,会根据需要增长 【参考方案1】:

首先,您为每个可观察对象使用subscribeOn(),因此它已经在并行执行。

有没有办法在并行获取数据的同时获得响应。例如,第一个端点可能需要 5 秒,而第二个端点可能需要 7 秒,但结束响应将在 7 秒后可用。

为此,您可以使用Observable.zip,如下所示,其中所需的时间是 最多两个调用:

val disposable = Observable.zip(
        firstNetworkCall().subscribeOn(Schedulers.io()),
        secondNetworkCall().subscribeOn(Schedulers.io()),
        BiFunction
            firstResonse: ResponseOneType,
            secondResponse: ResponseTwoType ->
            combineResult(firstResponse, secondResponse) ))
.observeOn(androidSchedulers.mainThread())
        .subscribe  it -> doSomethingWithIndividualResponse(it) 

这个article 可能有助于可视化它在下面的工作方式。

【讨论】:

combinresult 在这里做什么!响应 1 和 2 的返回类型不同。我该如何组合它们? @luckysing_noobster 只需使用Pair<Response1, Response2> 其中Response1Response2 是您的两种返回类型。如果你想结合两个依赖的 Observables,这个答案应该为你提供代码 - 希望它有帮助:***.com/a/36639773/11040422【参考方案2】:

如果我在一个方法中顺序调用两个端点,它是否被认为是在两个不同线程上执行的并行调用。如果不是,我如何使用 RX 使这些 API 调用并行?

它们是平行的。您正在订阅 IO 调度程序上的 observable,而不是阻塞等待响应。

或一种在并行获取数据的同时获取响应的方法。例如,第一个端点可能需要 5 秒,而第二个端点可能需要 7 秒,但结束响应将在 7 秒后可用。

一种方法是使用zip() 将您的可观察对象组合成单个可观察对象,该可观察对象会在所有源都发出时发出。

【讨论】:

如何组合发出的响应?响应 1 和 2 的返回类型不同。我该如何组合它们? Pair<Response1, Response2>

以上是关于使用 RX And​​roid 进行并行 API 调用的主要内容,如果未能解决你的问题,请参考以下文章

OSX And​​roid Studio 的 gradle 无法读取 .bash_profile 环境变量 [重复]

android-studio-dir = C:\Program X And​​roid Studio not found at C:\Program FLUTTER PROBLEM

尝试使用 async.parallelLimit 进行连续的并行 API 调用

如何并行调用多个 API 进行负载测试(使用 Gatling)?

Agilent RF fundamentals - TX and RX

RxJS:使用 NestJS HttpService 对分页 API 进行并行 http 调用