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

如何在RecyclerView中加载Base64图片无卡顿?现有方案卡顿崩溃求助

问题分析与修复方案

核心问题

  • 手动转Bitmap引发内存爆炸:你在IO线程把Base64转成Bitmap再交给Glide,RecyclerView滚动时每个item都要生成新Bitmap,内存瞬间撑爆导致崩溃,同时高内存占用直接引发滚动卡顿。
  • 禁用缓存雪上加霜:skipMemoryCache(true)和DiskCacheStrategy.NONE让Glide完全不能复用图片,每次滚动都要重新处理,CPU和内存负担加倍。
  • 多余的协程调度:Glide内部已经做好了异步加载的线程管理,手动开协程不仅没用,还可能因为未绑定生命周期导致内存泄漏。

修复后的代码

private fun loadImage(
    imgProduct: ImageView,
    imgString: String
) {
    val requestOptions = RequestOptions()
        .downsample(DownsampleStrategy.DEFAULT)
        .override(300, 300)
        // 恢复缓存,让Glide复用已加载的图片
        .skipMemoryCache(false)
        .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)

    Glide.with(imgProduct.context) // 绑定ImageView的生命周期,自动回收加载任务
        .asBitmap()
        .apply(requestOptions)
        .load(imgString) // 直接传Base64字符串,Glide会自动处理转换逻辑
        .placeholder(R.drawable.ic_no_image)
        .into(imgProduct)
}

额外优化点

  • 彻底移除convertBitMap()调用:不要再手动转换Base64到Bitmap,完全交给Glide处理,它会更高效地管理内存。
  • 优化采样策略:如果原图尺寸远大于300x300,把DownsampleStrategy.DEFAULT换成DownsampleStrategy.AT_MOST,能进一步压缩图片内存占用。
  • 源头压缩图片:如果服务端返回的Base64图片本身过大,建议让后端先压缩图片再传输,从根源减少内存压力。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 10:21:12