使用Retrofit+RxJava链式调用API开发Hacker News Android客户端问题
问题解答
1. RxJava链式调用实现方案
直接替换你的getTop20Stories实现即可:
override fun getTop20Stories(): Single<List<News>> { return getTopStoryIDs() // 截取前20条帖子ID .map { idList -> idList.take(20) } // 将List<Int>转为逐个发射ID的Observable .flatMapObservable { idList -> Observable.fromIterable(idList) } // 每个ID发起详情请求,concatMapSingle可以保证返回结果和ID顺序一致,换成flatMapSingle则是并发请求速度更快但顺序不固定 .concatMapSingle { storyId -> getStory(storyId) } // 所有请求完成后组装为List返回 .toList() }
如果需要处理单个请求失败不影响整个列表的场景,可以给getStory(storyId)加上onErrorResumeNext,返回默认占位数据或者跳过错误条目即可。
2. 架构合理性评估
你当前的架构选型完全合理,不需要推翻重构:
- MVVM+Repository是Android官方推荐的标准化架构,各层职责清晰:
- 下层Api接口只负责定义网络请求规则
- Repository层封装所有数据操作逻辑,上层不需要关心数据是来自网络还是本地缓存,后续要加本地缓存、请求兜底逻辑只需要改Repository层即可
- ViewModel和View层完全解耦,符合单一职责原则
- 现有接口拆分也很合理,
getTopStoryIDs、getStory这类细粒度接口可以复用到其他业务场景,不用重复定义。
3. 方法调用方说明
getTop20Stories应该由ViewModel调用:
- MVVM架构的核心原则是View层(Fragment/Activity)只负责UI渲染和用户交互响应,不持有任何业务逻辑
- ViewModel调用Repository的方法获取数据后,将数据转为可观察的LiveData/StateFlow,Fragment只需要观察对应的数据变化更新UI即可
- 这种设计也可以保证配置变更(比如屏幕旋转)时,ViewModel不会被销毁,已经拉取到的列表数据不会丢失,不需要重复请求。
内容的提问来源于stack exchange,提问作者Ozan ŞAN
相关产品推荐
相关产品推荐

