android - 使用 Retrofit + Rx 链接 API 请求
问题描述
我正在尝试使用这个API 为 Hacker News 开发一个客户端,只是为了学习 Android 是如何工作的,作为一个个人项目。我尝试遵循一些教程,但我被困在某个点上。
我想检索前 N 个故事的标题、赞成票等。这可以通过以下方式使用此 api 完成:
- 向 api 发出请求以检索热门帖子的 ID(准确地说是 500 个)
- 对于每个 ID,向 api 的帖子端点发出请求以检索详细信息。
似乎我被困在如何为我想要的帖子创建 N 个不同的网络请求,检索它们并将它们放在列表中,然后将它们显示在我的片段上。 我正在尝试使用存储库来遵循 MVVM 模式。相关文件在这里:
新闻API.kt:
interface NewsApi {
@GET("topstories.json")
fun getTopStories() : Single<List<Int>>
@GET("item/{id}")
fun getItem(@Path("id") id: String): Single<News>
}
MainRepository.kt (I):
interface MainRepository {
fun getTopStoryIDs(): Single<List<Int>>
fun getStory(storyId: Int): Single<News>
fun getTop20Stories(): Single<List<News>>
}
该News
对象是一个简单的数据类,其中包含从 中返回的所有 JSON 字段item/{id}
,因此我将其省略。
这是我的存储库,实现:
class DefaultMainRepository @Inject constructor(
private val api: NewsApi
) : MainRepository {
override fun getTopStoryIDs(): Single<List<Int>> {
return api.getTopStories()
}
override fun getStory(storyId: Int): Single<News> {
return api.getItem(storyId.toString())
}
override fun getTop20Stories(): Single<List<News>> {
TODO("HOW?")
}
}
我最关心的问题是:
- 如何使用 Retrofit / RxJava 以这种方式进行链式 API 调用?我已经使用 flatMap 查看了以前的答案,但就我而言,使用 Int 列表,我实际上并不知道如何正确地做到这一点。
- 这是解决这个问题的正确方法吗?我是否应该放弃我所做的架构选择,并尝试以全新的方式思考?
- 假设我可以完成
getTop20Stories
(顾名思义,应该检索 20 条新闻,使用来自 的结果getTopStoryIDs
,前 20 个元素的时间应该可以解决问题),我将如何从中检索数据?谁应该负责检索响应?虚拟机?分段?
提前致谢。
解决方案
您在 FlatMap 的正确轨道上。
这样的事情应该可以解决问题:
getTopStoryIDs().flatMap { storyId -> getStory(storyId) }
推荐阅读
- java - java中的多态行为
- python - 如何将单词列表与字典项匹配并返回python中的键?
- spring - 错误以 java.lang.ClassNotFoundException: Spring boot 中的 org.apache.tools.ant.Project 出现
- machine-learning - cross_val_score 与另一种计算精度的方法之间的区别
- node.js - 使用 NodeJS 定期查询多个传感器
- mapreduce - 运行 hadoop fs -ls 时出现错误没有 cldb 条目
- hadoop - 在 HBase 与 Parquet 文件中存储数据
- java - 返回私有成员时,返回的值是对该成员的直接引用还是单独的副本?
- python - cyordereddict 的安装问题
- python - 允许使用 python 脚本连接 selenium 独立服务器