RxJava Singles条件串联实现:仅首个结果为空时请求第二个数据源
嘿,这个需求用RxJava其实很好实现,我来给你捋清楚具体怎么做~
核心思路就是根据第一个请求的结果动态决定是否发起第二个请求,咱们可以用flatMap操作符来完成这个逻辑判断,具体步骤和代码示例如下:
实现步骤
- 先发起A类型Events的请求,得到一个
Single<List<Event>>; - 通过
flatMap检查返回的列表是否为空:- 如果列表非空,直接返回这个列表的Single,用来填充UI;
- 如果列表为空,就发起B类型Events的请求,用它的结果来填充UI;
- 最后订阅组合后的数据流,处理成功和错误情况。
代码示例
假设你已经有两个请求方法:
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
相关产品推荐
相关产品推荐

