2012-05-18 33 views
5

这里是一块简化代码:这是Android上下文泄漏吗?

static Activity longLivedField; 

onCreate(...) {  
    longLivedField = this; // the only write to this field 
} 

我见过的人声称这是一个方面泄漏,并为它创建的修复。典型的解决方法是在适当的地方取消该字段。例如,在onPause()

onPause() { 
    longLivedField = null; 
} 
+0

你这样做是为了保持不同情境下? – accordionfolder

+0

是的。有建议说我们不应该这样做,而是使用getApplicationContext()来代替。但我只想了解为什么这样做会成为一个问题。 – dacongy

回答

3

是的,这是一个内存泄漏,如果你不废掉领域中的onPause()。你几乎肯定不想保留对任何Activity的静态引用。你试图达到什么目标?

Android开发者网站包含描述如何避免像这样的内存泄漏一个方便的网页:

Avoiding Memory Leaks

+0

我曾经多次阅读过这篇文章。不过,区别在于,在该示例中,静态字段仅写入一次。但是在这个例子中,每次创建新的活动对象时都会写入静态字段(当然,实际上调用onCreate()时),因此旧字段(应该泄露的字段)不是从静态字段可以更长时间地到达。所以它似乎只能在很短的时间内泄漏,这大概是在onPause()和onCreate()中的赋值之间。 – dacongy

+2

这是真的,但当用户移动到不同的活动时会发生泄漏。静态字段将指向您的活动的最后一个实例,从而泄漏。 –

+1

下面是我对你的答案的理解,如果我错了,请纠正我的错误:目标是当用户移动到不同的活动时,垃圾收集活动的最后一个实例成为可能。这样做很重要,因为一个活动的整个GUI层次结构(我想明确地说,因为多个活动或多个应用程序中的泄漏显然是有害的)可能会消耗相当大量的内存。这样做是合理的,因为垃圾收集和对象分配的效率足以快速收集和分配GUI层次结构。 – dacongy