You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用RxJava2实现遍历FileModel列表批量获取Bitmap列表?

解决RxJava转换图片流的问题

我明白你的问题啦——你已经用Observable遍历了FileModel列表并发起了getFile请求,但卡在了怎么把返回的ResponseBody转换成Bitmap这一步。别担心,咱们一步步来调整代码:

首先,你需要把每个getFile返回的Single<ResponseBody>,通过generatePhoto转换成Single<Bitmap>,然后把所有Bitmap收集成列表返回。这里用flatMapSingle来衔接这两个Single流最合适,它能把Observable的每个元素转换成Single,然后合并成Observable流。

完整实现代码

fun getPhotos(list: List<FileModel>): Single<List<Bitmap>> {
    return Observable.fromIterable(list)
        // 遍历每个FileModel,发起getFile请求并转换为Bitmap
        .flatMapSingle { fileModel ->
            getFile(fileModel.id)
                // 把ResponseBody转换成Bitmap
                .flatMap { responseBody ->
                    generatePhoto(responseBody)
                        // 可选:过滤掉转换失败返回的null
                        .filter { it != null }
                        // 因为过滤了null,这里可以安全地拆包非空Bitmap
                        .map { it!! }
                }
        }
        // 把所有Bitmap收集成列表
        .toList()
        // 转换为Single类型返回
        .toSingle()
}

关键步骤解释

  1. flatMapSingle的作用:替代你原来的flatMap,它能将每个FileModel对应的Single<ResponseBody>转换为Single<Bitmap>,保证每个请求的流能正确衔接。
  2. 链式调用generatePhoto:在getFile的Single流后面直接调用flatMap,传入generatePhoto就能把ResponseBody转换成Bitmap。
  3. 处理null情况:因为generatePhoto返回的是Single<Bitmap?>,如果不想列表里出现null,可以用filter过滤掉null值,再用map拆包成非空的Bitmap。
  4. 收集结果:toList()会把Observable流里的所有Bitmap收集成一个列表,最后用toSingle()转换成你需要的Single<List<Bitmap>>。

如果需要控制并发请求的数量(比如避免同时发起太多网络请求),还可以给flatMapSingle加参数:

.flatMapSingle(maxConcurrency = 3) { fileModel ->
    // 你的转换逻辑
}

这样就能完美实现你想要的功能啦!

内容的提问来源于stack exchange,提问作者xskit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:19:24