gpt4 book ai didi

Android - 内存泄漏还是?

转载 作者:太空狗 更新时间:2023-10-29 15:31:07 25 4
gpt4 key购买 nike

两天前我注意到一件事。我有一个 map Activity 的微调器。在 Activity 的 OnCreate() 方法中,我用数据填充微调器。之后我在 DDMS 中启动堆分析器我开始打开/关闭微调器。我注意到当我打开微调项时 VM 分配内存,但是当我关闭它时,VM 不会释放此内存。我已尝试启动 GC,但内存仍在分配中。我一个一个地做了 20 次,分配的内存从 3.5MB 增加到 7MB。怎么了?我在 google groups 中发现了一个问题,但他们还没有回答。
Spinner memory leak

我重写了微调器适配器中的所有代码,但问题仍然存在。我阅读了有关该主题的一些建议

Avoid memory leaks

有些东西我没有得到:

当 Drawable 附加到 View 时, View 被设置为 drawable 的回调。在上面的代码 fragment 中,这意味着可绘制对象具有对 TextView 的引用,而 TextView 本身具有对 Activity (上下文)的引用,而 Activity 又引用了几乎所有内容(取决于您的代码。)

这是什么意思?如果我有一个 textview 并将其设置为可绘制对象(我注意到可绘制对象是静态的),textview 对象具有对可绘制对象的引用,而可绘制对象也具有对 View 的引用?如果这是真的,那么它们将无法被 GC 销毁,因为它们都相互引用了?对象之间的反向引用(回调)依赖性是什么?

最佳答案

抱歉,我无法帮助您解决 Spinner 问题,但我可以尝试第二部分:

Android 开发者博客上的 Romain Guy 帖子解释了两件重要的事情。

首先:

创建 View (TextView、ImageView...)时,不得使用 Activity 上下文创建它

// DO NOT DO THIS
TextView label = new TextView(this);

否则,View 会引用您的 Activity,并且永远不会被释放。

相反,当您以编程方式创建 View 时,您必须使用应用程序上下文:

TextView label = new TextView(getApplicationContext());

第二个:

当您将 Drawable 链接到 View 时,它会通过 Context 对您的 Activity 进行回调。如果你离开它,它会在你的 Activity 被销毁时泄漏内存。

避免这种情况的方法是“在 Activity 被销毁时将存储的可绘制对象的回调设置为 null”,例如使用 ImageView:

protected void onDestroy() {
imageView.getDrawable().setCallback(null);
super.onDestroy();
}

您必须对背景可绘制对象执行相同的操作...

希望对您有所帮助。

关于Android - 内存泄漏还是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5577316/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com