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

RxJava Singles条件串联实现:仅首个结果为空时请求第二个数据源

嘿,这个需求用RxJava其实很好实现,我来给你捋清楚具体怎么做~

核心思路就是根据第一个请求的结果动态决定是否发起第二个请求,咱们可以用flatMap操作符来完成这个逻辑判断,具体步骤和代码示例如下:

实现步骤

  1. 先发起A类型Events的请求,得到一个Single<List<Event>>;
  2. 通过flatMap检查返回的列表是否为空:
    • 如果列表非空,直接返回这个列表的Single,用来填充UI;
    • 如果列表为空,就发起B类型Events的请求,用它的结果来填充UI;
  3. 最后订阅组合后的数据流,处理成功和错误情况。

代码示例

假设你已经有两个请求方法:

  • fetchTypeAEvents():返回Single<List<Event>>,获取A类型Events;
  • fetchTypeBEvents():返回Single<List<Event>>,获取B类型Events;

那么组合后的代码可以写成这样:

fetchTypeAEvents()
    .flatMap(typeAEvents -> {
        // 判断A类型结果是否非空
        if (!typeAEvents.isEmpty()) {
            return Single.just(typeAEvents);
        } else {
            // 为空则发起B类型请求
            return fetchTypeBEvents();
        }
    })
    .subscribeOn(Schedulers.io()) // 请求在IO线程执行
    .observeOn(AndroidSchedulers.mainThread()) // 切换到主线程更新UI
    .subscribe(
        events -> populateList(events), // 填充列表的逻辑
        throwable -> {
            // 处理请求失败的情况(比如A和B都请求失败)
            Log.e("EventRequest", "Failed to fetch events", throwable);
            showErrorState();
        }
    );

补充说明

  • 这里用flatMap而不是switchIfEmpty的原因是:switchIfEmpty是当第一个Single没有发射任何数据(比如请求错误或者主动发射empty)时才会触发第二个Single,但你的场景是第一个Single成功返回了空列表,这时候switchIfEmpty不会生效,所以必须手动判断列表是否为空。
  • 如果B类型的请求也返回空列表,那populateList会拿到空列表,你可以在这个方法里处理空状态(比如显示“暂无数据”的提示)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:22:54