You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用RxAndroid异步调用多个独立API并等待全部完成

用RxAndroid + Retrofit实现多API并行等待的完美方案

嘿,你的这个需求刚好是RxJava最擅长解决的场景之一!完全不用手动维护布尔值来追踪每个API的状态,用zip操作符就能优雅搞定,而且还能让四个API并行请求,比同步调用效率高多了。

核心思路

因为四个API互不依赖,我们可以把每个API请求都转换成Observable,然后用Observable.zip()操作符把它们合并在一起。这个操作符会等待所有Observable都发射出数据后,把所有结果打包成一组数据返回给你,这时你就能拿到所有API的返回值做后续计算了。

代码示例

假设你的四个API接口返回的Observable分别是这样的:

// 假设这四个是你的DataSource里的方法,返回对应类型的Observable
fun getLivePay(): Observable<LivePayResponse>
fun getUserInfo(): Observable<UserInfoResponse>
fun getOrderList(): Observable<OrderListResponse>
fun getWalletBalance(): Observable<WalletBalanceResponse>

那在Activity里你可以这么写:

fun getData() {
    // 把四个API请求的Observable都准备好,每个请求都在IO线程执行
    val livePayObservable = dataSource.getLivePay()
        .subscribeOn(Schedulers.io())
    
    val userInfoObservable = dataSource.getUserInfo()
        .subscribeOn(Schedulers.io())
    
    val orderListObservable = dataSource.getOrderList()
        .subscribeOn(Schedulers.io())
    
    val walletBalanceObservable = dataSource.getWalletBalance()
        .subscribeOn(Schedulers.io())

    // 用zip合并四个Observable,等待所有请求完成后统一处理
    val disposable = Observable.zip(
        livePayObservable,
        userInfoObservable,
        orderListObservable,
        walletBalanceObservable,
        // 这里接收四个API的返回结果,执行后续业务逻辑
        { livePayData, userInfoData, orderListData, walletBalanceData ->
            // 所有数据都已准备就绪,在这里处理计算、UI更新等操作
            processAllData(livePayData, userInfoData, orderListData, walletBalanceData)
            Unit
        }
    )
    .observeOn(AndroidSchedulers.mainThread()) // 切换回主线程处理结果
    .subscribe(
        { 
            // 所有请求成功完成后的回调
            Toast.makeText(this, "所有数据加载完成", Toast.LENGTH_SHORT).show()
        },
        { error ->
            // 任何一个请求失败都会走到这里,统一处理错误
            Log.e("DataLoadError", "请求失败: ${error.message}")
            Toast.makeText(this, "数据加载失败", Toast.LENGTH_SHORT).show()
        }
    )

    // 记得把disposable添加到CompositeDisposable,Activity销毁时取消订阅
    compositeDisposable.add(disposable)
}

// 示例:处理所有数据的业务方法
private fun processAllData(
    livePay: LivePayResponse,
    userInfo: UserInfoResponse,
    orderList: OrderListResponse,
    walletBalance: WalletBalanceResponse
) {
    // 这里写你的业务逻辑,比如数据组合、计算、更新UI等
}

关键细节说明

  • 并行执行:四个API请求会同时在IO线程发起,比同步调用节省大量时间
  • 自动等待:zip会自动等待所有请求都成功返回才会触发后续逻辑,完全不用手动追踪每个请求的状态
  • 错误统一处理:只要有一个API请求失败,整个zip流就会触发onError,你可以在这里统一处理错误情况
  • 线程规范:通过subscribeOn指定请求在IO线程执行,observeOn切回主线程更新UI,符合Android的线程要求

额外补充:如果允许部分请求失败?

如果你的业务场景允许部分API失败,仍然可以用其他操作符比如forkJoin(RxJava 2+支持),或者给每个Observable添加onErrorReturn来返回默认值,这样即使某个请求失败,整个流依然能继续执行。不过根据你的需求,后续计算需要基于所有数据,所以zip是最适合的选择。

内容的提问来源于stack exchange,提问作者ARiF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:07:03