Android中Retrofit结合RxJava更新关联Observable数据的实现方案
Retrofit + RxJava 实现Table数据更新与集合整合方案
核心实现代码
retrofitWSClient.getServiceProductBOM(...) .subscribeOn(Schedulers.io()) .flatMapIterable(bom -> bom.getTable()) .flatMap(table -> { // 发起Product请求,同时绑定当前Table的引用 return retrofitWSClient.getProduct(table.getProductForeignKey()) .map(product -> { // 更新Table的productCode字段,组合外键与产品编码 table.setProductCode(table.getProductForeignKey() + " - " + product.getProductcode()); return table; }) .onErrorReturn(throwable -> { // 单个Product请求失败时的兜底处理 table.setProductCode(table.getProductForeignKey() + " (获取产品信息失败)"); return table; }); }) .toList() .observeOn(AndroidSchedulers.mainThread()) .subscribe(updatedTables -> { // 将更新后的完整集合传给Adapter yourAdapter.setData(updatedTables); yourAdapter.notifyDataSetChanged(); }, throwable -> { // 处理全局流程异常(如BOM请求失败) Log.e("DataProcess", "流程异常", throwable); });
关键步骤说明
- 线程调度位置:
subscribeOn(Schedulers.io())放在最上游,确保所有网络请求(包括BOM和Product接口)都在IO线程执行,避免阻塞主线程;observeOn放在toList()之后,只在最终更新UI时切换到主线程。 - 保留Table引用:在
flatMap内部处理单个Table时,直接持有当前Table的引用,获取到Product后直接更新其字段,再返回更新后的Table。 - 异常兜底:用
onErrorReturn处理单个Product请求失败的情况,保证整个数据流不会因为某一条请求失败而中断,所有Table都会被处理后返回。 - 集合整合:通过
toList()将分散的单个Table Observable重新收集成完整的List<Table>,最终订阅时直接拿到可用于Adapter的完整数据集。
额外注意事项
- 如果产品接口支持批量查询,建议改成批量请求外键列表,减少网络请求次数,提升性能,此时RxJava逻辑可以调整为:先提取所有外键→批量请求Product→循环匹配更新Table。
- 记得用
CompositeDisposable管理订阅,在页面销毁时调用dispose(),避免内存泄漏。
内容的提问来源于stack exchange,提问作者Favrosc
相关产品推荐
相关产品推荐

