繁体   English   中英

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

[英]Cached image still grow memory usage on rotation

我知道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(科特琳)上:

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,因此它应该仅在第一次创建时才增加内存,并且要保持相同的内存使用率,但这不是真正的情况,请查看此内存监视器: 在此处输入图像描述

为什么在旋转屏幕时它仍在增长?

从40mb(首次创建)到近110mb(经过一些旋转)

我已经在较旧的版本中出现了内存泄漏,并且我试图再次避免它

我应该担心吗? (在我拍照后10分钟仍保持相同的110mb,我结束了活动)

ps1:使用svg_drawable(从AndroidStudio->新建->矢量资产导入)

ps2:我将使用风景版本(这只是没有它的演示)

首先,我建议您不要使用静态引用,请不要使用它们。 即使在用户角度看销毁了它们所附着的组件,它们也保留了对该组件的内存引用。 例如,当您使用静态成员来保存事物时,它们将在整个过程的生命周期中保存它们拥有的数据,并且隐式地保存它们所属的类的引用。 因此,基本上,当配置更改时,静态成员将不允许垃圾收集器清除该组件的内存,因为用户正在使用该组件的新实例,因此该内存不再由用户使用。 因此,基本上在Application有一个onConfigurationChanged方法,您应根据要求重写该方法,并且也应进行此操作 祝你好运。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM