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

Android:RecyclerView大量Bitmap占内存过高,如何在Activity关闭时清理Picasso缓存

关于Picasso加载图片导致内存过高的优化方案

为什么你当前的配置优化效果有限

你设置的MemoryPolicy.NO_CACHE和MemoryPolicy.NO_STORE仅作用于图片请求的缓存逻辑:

  • NO_CACHE:仅让本次请求跳过读取Picasso全局内存缓存
  • NO_STORE:仅不让本次请求的返回结果写入Picasso全局内存缓存
    这两个参数完全不会处理已经加载到ImageView上、被视图持有的Bitmap,因此对已占用内存的回收没有帮助。

可行的优化方案

  • 次级Activity销毁时主动回收资源

    在跳转后打开的次级Activity的onDestroy()生命周期中执行以下操作:
    1. 给该页面所有Picasso请求设置专属TAG,销毁时调用Picasso.get().cancelTag(ACTIVITY_TAG)取消所有未完成的图片请求,避免无效请求完成后继续占用内存
    2. 遍历次级Activity的RecyclerView所有可见/缓存子项,调用imageView.setImageDrawable(null)解绑ImageView持有的Bitmap引用
    3. 若你确定该页面加载的图片不需要在全局缓存中留存,可以手动移除对应URL的内存缓存:
    Picasso.get().memoryCache().remove(imageUrl);
    
  • 优化Picasso全局缓存配置

    初始化Picasso时自定义内存缓存上限,不要使用默认的「应用最大可用内存1/7」的规则,根据你的业务场景适当缩小:
    // 示例:设置全局内存缓存上限为100MB
    Picasso customPicasso = new Picasso.Builder(context)
            .memoryCache(new LruCache(100 * 1024 * 1024))
            .build();
    Picasso.setSingletonInstance(customPicasso);
    
  • 强制按视图尺寸加载压缩图片

    所有图片加载请求都添加fit()+centerCrop()(或者根据布局需求用centerInside()),让Picasso自动按照ImageView的尺寸压缩图片,避免加载远大于视图尺寸的原图浪费内存:
    Picasso.get()
            .load(imageUrl)
            .fit()
            .centerCrop()
            .into(imageView);
    
  • 排查内存泄漏

    用Android Studio的Profiler工具抓取堆转储,确认次级Activity销毁后没有被静态变量、单例类等长生命周期对象持有引用,避免整个页面的所有Bitmap资源都无法被GC回收。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:06:04