RxJava2。对列表中的每个项目执行请求
RxJava2. Execute a request for every item in a list
我有一个列表 List<FileModel>
FileModel
只是一个 class 包含 id: Int
id
- 是我需要获取并转换为位图的照片文件的 ID
我有一个要求:
fun getFile(fileId: Int): Single<ResponseBody>
我们可以将此请求returns ResponseBody
转换为位图
和
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?
}
Observable.fromIterable(list) 应该为列表中的每个项目发出一个事件,这意味着你 return 输入 getPhotos 是 Flowable<Bitmap>
因为 Flowable 可以 return 不止一个值。
我想你真正想要的是:
fun getPhotos(list: List<FileModel>): Flowable<Bitmap> {
return Observable.fromIterable(list)
.map { getFile(it.id) }
.map { generatePhoto(it) }
}
如果你想发出一个位图列表,你可以像这样使用单个位图
fun getPhotos(list: List<FileModel>): Single<List<Bitmap>> {
return Single.just(list)
.map { it.map { getFile(it.id) } }
.flatMap {
Single.just(it.map { generatePhoto(it) })
}
}
你试过了吗:
fun getPhotos(list: List<FileModel>): Single<List<Bitmap>> {
return Observable.fromIterable(list)
.flatMapSingle { getFile(it.id) }
.flatMapSingle { generatePhoto(it) }
}
?
你可以这样做:
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
作为依赖项,你可以从 List
中得到一个 Observable
和一个扩展函数,像这样:
myList.toObservable()
我有一个列表 List<FileModel>
FileModel
只是一个 class 包含 id: Int
id
- 是我需要获取并转换为位图的照片文件的 ID
我有一个要求:
fun getFile(fileId: Int): Single<ResponseBody>
我们可以将此请求returns ResponseBody
转换为位图
和
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?
}
Observable.fromIterable(list) 应该为列表中的每个项目发出一个事件,这意味着你 return 输入 getPhotos 是 Flowable<Bitmap>
因为 Flowable 可以 return 不止一个值。
我想你真正想要的是:
fun getPhotos(list: List<FileModel>): Flowable<Bitmap> {
return Observable.fromIterable(list)
.map { getFile(it.id) }
.map { generatePhoto(it) }
}
如果你想发出一个位图列表,你可以像这样使用单个位图
fun getPhotos(list: List<FileModel>): Single<List<Bitmap>> {
return Single.just(list)
.map { it.map { getFile(it.id) } }
.flatMap {
Single.just(it.map { generatePhoto(it) })
}
}
你试过了吗:
fun getPhotos(list: List<FileModel>): Single<List<Bitmap>> {
return Observable.fromIterable(list)
.flatMapSingle { getFile(it.id) }
.flatMapSingle { generatePhoto(it) }
}
?
你可以这样做:
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
作为依赖项,你可以从 List
中得到一个 Observable
和一个扩展函数,像这样:
myList.toObservable()