Android:RecyclerView大量Bitmap占内存过高,如何在Activity关闭时清理Picasso缓存
关于Picasso加载图片导致内存过高的优化方案
为什么你当前的配置优化效果有限
你设置的MemoryPolicy.NO_CACHE和MemoryPolicy.NO_STORE仅作用于图片请求的缓存逻辑:
NO_CACHE:仅让本次请求跳过读取Picasso全局内存缓存NO_STORE:仅不让本次请求的返回结果写入Picasso全局内存缓存
这两个参数完全不会处理已经加载到ImageView上、被视图持有的Bitmap,因此对已占用内存的回收没有帮助。
可行的优化方案
次级Activity销毁时主动回收资源
在跳转后打开的次级Activity的onDestroy()生命周期中执行以下操作:- 给该页面所有Picasso请求设置专属TAG,销毁时调用
Picasso.get().cancelTag(ACTIVITY_TAG)取消所有未完成的图片请求,避免无效请求完成后继续占用内存 - 遍历次级Activity的RecyclerView所有可见/缓存子项,调用
imageView.setImageDrawable(null)解绑ImageView持有的Bitmap引用 - 若你确定该页面加载的图片不需要在全局缓存中留存,可以手动移除对应URL的内存缓存:
Picasso.get().memoryCache().remove(imageUrl);- 给该页面所有Picasso请求设置专属TAG,销毁时调用
优化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
相关产品推荐
相关产品推荐

