gpt4 book ai didi

android - 如何异步调用 rest api 并等待所有调用在 rx-android 中完成

转载 作者:行者123 更新时间:2023-11-29 16:43:45 24 4
gpt4 key购买 nike

在一个 Activity 中,我需要调用 4 个 rest API。一个 API 不依赖于另一个 API。但是为了进行计算,我需要所有 4 个 API 的数据。因此,我打算异步调用 API,但要等到所有 API 加载完毕。我正在使用 RxAndroid 进行改造。我不知道如何使用 rx 实现这一点。我不想为每个 API 调用使用 bool 值来跟踪它是否已加载。有什么rx方式吗?

现在,我像下面这样同步所有调用

示例代码:

fun getData() {
val disposable = dataSource.getLivePayments()
.subscribeOn(schedulerProvider.io())
.observeOn(schedulerProvider.ui())
.subscribe(({ livePayments: List<Payment> ->
this.livePayments.clear()
this.livePayments.addAll(livePayments)

dataSource.getLiveRemittances()
.subscribeOn(schedulerProvider.io())
.observeOn(schedulerProvider.ui())
.subscribe(({ liveRemittances: List<Remittance> ->
this.liveRemittances.clear()
this.liveRemittances.addAll(liveRemittances)

// similarly called dataSource.getLiveTimeSheets()
// and dataSource.getArchiveTimeSheets()
// synchronous
// then call
calculateAmount()
}), ({ t -> this.parseError(t) }))
}), ({ t -> this.parseError(t) }))

compositeDisposable.add(disposable)
}

fun calculateAmount() {
val balance = if(liveRemittances.isNotEmpty()) {
(sum(payment.amount) - sum(timesheet.amount)) * sum(liveRemittance.amount)
} else {
(sum(payment.amount) - sum(timesheet.amount))
}
}

注意:在此过程中,如果某些 API 失败,它会停止执行下一个 API,但我希望它应该调用下一个 API。

最佳答案

如果所有 API 调用都是独立的,您可以使用 zip运算符(operator):

Single.zip(single1, single2, ..., (result1, result2, ... -> (combine the results)})

如果有相关结果,您可以使用 flatMap

single1.flatMap(result -> (generate a new Single based on that result)})

关于android - 如何异步调用 rest api 并等待所有调用在 rx-android 中完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49475625/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com