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

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);
    });

关键步骤说明

  1. 线程调度位置:subscribeOn(Schedulers.io())放在最上游,确保所有网络请求(包括BOM和Product接口)都在IO线程执行,避免阻塞主线程;observeOn放在toList()之后,只在最终更新UI时切换到主线程。
  2. 保留Table引用:在flatMap内部处理单个Table时,直接持有当前Table的引用,获取到Product后直接更新其字段,再返回更新后的Table。
  3. 异常兜底:用onErrorReturn处理单个Product请求失败的情况,保证整个数据流不会因为某一条请求失败而中断,所有Table都会被处理后返回。
  4. 集合整合:通过toList()将分散的单个Table Observable重新收集成完整的List<Table>,最终订阅时直接拿到可用于Adapter的完整数据集。

额外注意事项

  • 如果产品接口支持批量查询,建议改成批量请求外键列表,减少网络请求次数,提升性能,此时RxJava逻辑可以调整为:先提取所有外键→批量请求Product→循环匹配更新Table。
  • 记得用CompositeDisposable管理订阅,在页面销毁时调用dispose(),避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 19:23:10