Android中RxKotlin多参数逐个调用API并汇总结果方案求助
解决方案
方式一:用zip并行执行所有请求
zip会等待所有请求成功后返回汇总结果,任一请求失败则直接触发错误回调,适合无顺序要求、追求效率的场景。
实现代码
override fun deleteSingleVideoOneByOne(paths: ArrayList<String>) { val apiService = RetrofitInstance.getApiServiceXMLForR2( Constants.BASE_URL_NEW_CAMERA_R2_4K_PRO ) // 把每个path转换成独立的API请求Observable val requestList = paths.map { singlePath -> apiService.r2NtKCommandExecute("6006", arrayListOf(singlePath)) .subscribeOn(schedulerProvider.io()) } trackDisposable( Observable.zip(requestList) { responses -> // 过滤并返回所有成功的响应 responses.filterIsInstance<FunctionModel>() } .observeOn(schedulerProvider.ui()) .subscribe({ allSuccessResponses -> // 全部请求成功,通知回调 callback?.onSuccessDeleteAllVideos(allSuccessResponses) }, { error -> // 任一请求失败,触发错误处理 handlerError(error) }) ) }
方式二:用concatMap串行逐个执行请求
如果需要严格按顺序执行(上一个请求成功后才发起下一个),用concatMap,任一失败会终止后续请求并触发错误。
实现代码
override fun deleteSingleVideoOneByOne(paths: ArrayList<String>) { val apiService = RetrofitInstance.getApiServiceXMLForR2( Constants.BASE_URL_NEW_CAMERA_R2_4K_PRO ) trackDisposable( Observable.fromIterable(paths) .concatMap { singlePath -> apiService.r2NtKCommandExecute("6006", arrayListOf(singlePath)) .subscribeOn(schedulerProvider.io()) // 可选:实时通知单个请求成功 .doOnNext { callback?.onSuccessDeleteSingleVideo(it) } } .toList() // 收集所有成功响应,仅当全部成功时执行 .observeOn(schedulerProvider.ui()) .subscribe({ allSuccessResponses -> callback?.onSuccessDeleteAllVideos(allSuccessResponses) }, { error -> handlerError(error) }) ) }
注意事项
- 调整API参数:将原来的整个
paths列表,改为每个请求传单个路径的列表(arrayListOf(singlePath)),确保接口能正确接收单个路径。 - 扩展回调接口:建议新增
onSuccessDeleteAllVideos方法,用于传递全部请求成功的汇总结果。 - 错误处理:两种方式都会在任一请求失败时立即进入错误回调,符合你“任一失败返回失败响应”的需求。
内容的提问来源于stack exchange,提问作者MARSH
相关产品推荐
相关产品推荐

