Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 这是安卓上下文泄漏吗?_Android_Memory Leaks - Fatal编程技术网

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;
}