![](/img/trans.png)
[英]RxJava2: execute an async function for every item in a list and wait for callback
[英]RxJava2. Execute a request for every item in a list
我有一个列表List<FileModel>
FileModel
只是一个包含id: Int
的类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?
}
Observable.fromIterable(list)应该为列表中的每个项目发出一个事件,这意味着您返回的getPhotos类型为Flowable Flowable<Bitmap>
因为Flowable可以返回多个值。
我认为您真正想要的是:
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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.