繁体   English   中英

RxJava2。 对列表中的每个项目执行请求

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM