android - RxJava2。对列表中的每个项目执行请求
问题描述
我有一个清单List<FileModel>
FileModel
只是一个类包含id: Int
id
- 是我需要获取并投射到位图的照片文件的 ID
我有个请求:
fun getFile(fileId: Int): Single<ResponseBody>
此请求返回ResponseBody
我们可以转换为 Bitmap
和
fun generatePhoto(responseBody: ResponseBody): Single<Bitmap?>
我想要的是创建一个函数
fun getPhotos(list: List<FileModel>): Single<List<Bitmap>> {
// Execute getFile(...) for each item in the list
// Cast getFile(...) result to Bitmap using generatePhoto(...)
// Return a list of Bitmaps
}
我已经尝试过这样的事情,但这是完全错误的
fun getPhotos(list: List<FileModel>): Single<List<Bitmap>> {
return Observable.fromIterable(list)
.flatMap { getFile(it.id) }
// How to call generatePhoto(...) here?
}
解决方案
你可以这样做:
fun getPhotos(list: List<FileModel>): Single<List<Bitmap>> {
// Get an Observable of the list
return Observable.fromIterable(list)
// Get a Single<ResponseBody> for every FileModel
.flatMapSingle { getFile(it.id) }
// Get a Single<Bitmap> for every ResponseBody
.flatMapSingle { file -> generatePhoto(file) }
// Put everything back on a list
.toList()
}
这样,您可以根据需要遍历列表flapMapping
,然后最后将其重新组合为列表。运算符只是将toList()
之前发出的项目放在一起的便利。
调用这个函数就可以了:
getPhotos(list)
.doOnSuccess { resultList ->
Log.d("Rx", "doOnSuccess.resultList=[$resultList]")
}
.subscribe()
顺便说一句,如果你有RxKotlin
一个依赖项,你可以Observable
从List
带有扩展函数的 a 中获取一个,如下所示:
myList.toObservable()
推荐阅读
- github - Github Pages 仅在某些目录中找不到 index.html
- prolog - 如何获取用户输入的每个单词的首字母
- mongodb - 我无法使用 Visual Studio Code 将 Strapi 与 MongoDB 连接起来。请协助我
- html - 如何修改里面的内容
- java - 类和子类之间的隐式和显式转换
- c - 如果一个变量是一个结构体的指针,那么通过指针变量访问结构体数据成员的操作符是什么?
- php - 替换单词并保持找到的字符串区分大小写
- sql - 如何识别两行数据的所有匹配列?
- function - 如何仅使用谷歌脚本为我的谷歌工作表创建条件格式?
- python - Selenium - 问题获取/单击按钮元素