如何异步调用 rest api 并等待所有调用在 rx-android 中完成
How to call rest apis async and wait untill all calls are done in rx-android
在 activity 中我需要调用 4 个休息 API。一个 API 不依赖于另一个。但是为了进行计算,我需要所有 4 API 的数据。所以,我打算调用 APIs 异步但要等到所有 API 都完成加载。我正在使用 RxAndroid 进行改造。我不知道如何使用 rx 实现这一点。我不想对每个 API 调用都使用布尔值来跟踪它是否已加载。有什么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.
在 activity 中我需要调用 4 个休息 API。一个 API 不依赖于另一个。但是为了进行计算,我需要所有 4 API 的数据。所以,我打算调用 APIs 异步但要等到所有 API 都完成加载。我正在使用 RxAndroid 进行改造。我不知道如何使用 rx 实现这一点。我不想对每个 API 调用都使用布尔值来跟踪它是否已加载。有什么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.