Android 这是安卓上下文泄漏吗?
下面是一段简化的代码:Android 这是安卓上下文泄漏吗?,android,memory-leaks,Android,Memory Leaks,下面是一段简化的代码: static Activity longLivedField; onCreate(...) { longLivedField = this; // the only write to this field } 我见过有人声称这是一个上下文泄漏,并为其创建修复程序。典型的修复方法是在适当的位置将字段置零。例如,在onPause()中: 是的,如果不将onPause()中的字段置零,则会导致内存泄漏。几乎可以肯定,您永远不希望保留对任何活动的静态引用。
static Activity longLivedField;
onCreate(...) {
longLivedField = this; // the only write to this field
}
我见过有人声称这是一个上下文泄漏,并为其创建修复程序。典型的修复方法是在适当的位置将字段置零。例如,在onPause()
中:
是的,如果不将onPause()中的字段置零,则会导致内存泄漏。几乎可以肯定,您永远不希望保留对任何活动的静态引用。你想要达到的目标是什么 Android developer网站包含一个方便的页面,介绍如何避免内存泄漏,如下所示:
您这样做是为了保持上下文关系吗?是的。有人建议我们不应该这样做,而是使用getApplicationContext()。但我只是想了解为什么这样做会成为一个问题。我以前读过好几次这篇文章。不过,不同之处在于,在该示例中,静态字段只写入一次。但在本例中,每次创建新的活动对象时(实际上,当调用onCreate()时),静态字段都会被写入,因此旧的活动对象(应该是泄漏的)不再可以从静态字段访问。因此,它似乎只能在短时间内泄漏,粗略地说,这介于onPause()和onCreate()中的赋值之间。这是真的,但泄漏会在用户移动到其他活动时发生。静态字段将指向您活动的最后一个实例,并因此泄漏。以下是我根据您的回答得出的理解,如果我错了,请纠正我:目标是当用户移动到其他活动时,可以对活动的最后一个实例进行垃圾收集。这样做很重要,因为一个活动的整个GUI层次结构(我想明确地说,因为多个活动甚至多个应用程序中的泄漏显然是有害的)可能会消耗相当大的内存量。这样做是合理的,因为垃圾收集和对象分配足够有效,可以相当快地收集和分配GUI层次结构。
onPause() {
longLivedField = null;
}