缓存的图像仍会增加旋转时的内存使用量

时间:2017-06-14 05:13:46

标签: android caching memory memory-leaks

我知道Android上的Drawable内存泄漏。我看到很多指南,我正在尝试自定义缓存的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));
    }

在我的活动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分钟仍然是110分钟,我完成了活动)

ps1:使用svg_drawable(从AndroidStudio导入 - &gt; New - &gt; Vector Asset)

ps2:我将拥有横向变体(这只是没有它的演示)

1 个答案:

答案 0 :(得分:0)

首先,我建议你不要使用静态引用,请不要使用它们。它们保存对组件的内存引用,即使它们附加到的组件在用户透视图中被销毁。例如,当您使用静态成员来保存事物时,它们将保存它们在过程生命周期中拥有的数据,并且它们隐式保存它们所属的类的引用。因此,基本上当配置更改时,静态成员将不允许垃圾收集器清理用户不再使用的组件的内存,因为用户正在使用该组件的新实例。所以基本上在Application中有一个方法onConfigurationChanged,你应该根据要求覆盖它,你也应该通过this。祝你好运。