如何用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
相关产品推荐
相关产品推荐

