缓存的图片在旋转时仍然会增加内存使用量

我知道在Android的可绘制内存泄漏。 我看了很多指南,并试图自定义缓存Drawable。

我做了什么测试:

public class myApp extends Application { public static HashMap<String, Drawable> test_svg_drawables = new HashMap<>(); ... public void onCreate() { super.onCreate(); ... test_svg_drawables.put("i1", ContextCompat.getDrawable(this, R.drawable.ic_svg_image1)); test_svg_drawables.put("i2", ContextCompat.getDrawable(this, R.drawable.ic_svg_image2)); test_svg_drawables.put("i3", ContextCompat.getDrawable(this, R.drawable.ic_svg_image3)); test_svg_drawables.put("i4", ContextCompat.getDrawable(this, R.drawable.ic_svg_image3)); } 

在我的Activity onCreate(Kotlin)上:

 imageView1.setImageDrawable(test_svg_drawables.get("i1")) imageView2.setImageDrawable(test_svg_drawables.get("i2")) imageView3.setImageDrawable(test_svg_drawables.get("i3")) imageView4.setImageDrawable(test_svg_drawables.get("i4")) 

正如大家所说,因为即时通讯使用缓存Drawables,它应该增加内存只有在第一次创建,并保持相同的内存使用情况,但这不是真的发生,看看这个内存监视器: enter image description here

为什么它在旋转屏幕的同时还在不断增长?

从40mb(首创)到110mb(经过一些轮转)

我已经有一些老版本的内存泄漏,并试图避免它再次

我应该担心吗? (在我拍照之后10分钟仍然是110mb,我完成了活动)

ps1:使用svg_drawable(从AndroidStudio导入 – > New – > Vector Asset)

ps2:我将有景观变体(这只是一个没有它的演示)

首先,我建议你不要使用静态引用,请不要使用它们。 它们持有对组件的内存引用,即使它们所连接的组件在用户视角下被销毁。 例如,当你使用静态成员来保存事物时,他们将保存他们在整个生命周期中所拥有的数据,并且隐含地保存着他们所属的类的引用。 所以基本上当配置发生变化时,静态成员将不允许垃圾回收器清理用户不再使用的组件的内存,因为用户正在使用该组件的新实例。 所以基本上在Application有一个onConfigurationChanged方法,你应该根据需要重写,你也应该通过这个 。 祝你好运。