2012-06-27 133 views
2

在这篇文章中的Android getApplicationContext内存管理

When to call activity context OR application context?

马克·墨菲说

“它可以创建内存泄漏,如果从getApplicationContext()的上下文保存到通过它您的通话创造的东西,你不需要清理,如果一个Activity持有某些东西,一旦Activity被垃圾收集,其他的东西也会被刷新,Application对象会保留在你的进程的整个生命周期中。

什么调用创建应用程序上下文保持的东西?

我有一个库需要一个上下文的各种东西。它可以在后台运行并跨越活动,但使用和更新活动上下文会有问题。

我认为这可能是使用应用程序上下文更适合的场合之一?

+0

是的..使用应用程序上下文。 – Blundell

回答

1

如果库中对象的生命周期可以跨越多个活动,那么绝对使用应用程序上下文。使用活动上下文可防止垃圾收集器将上下文丢弃。由于活动上下文可以保存相当多的数据,因此内存使用量可能会急剧增加。

另外,如果一个活动被关闭,它会放弃它的窗口标记。试图用这种上下文产生对话将给出BadTokenException。因此,如果对象不直接与活动生命周期相关联,则将活动上下文提供给对象是没有意义的。

编辑:Here is a credible source

+0

这就是我正在考虑使用getApplicationContext的原因,它更容易控制而不是跨活动管理上下文,但真的想现在如何(如果?)在应用程序上下文的场景中泄漏内存是可能的? – Cullan

+0

如果库某种程度上取决于上下文在某个时刻失效,或者库中存在使内存在上下文的整个生命周期中存在错误的唯一额外风险。 – pgsandstrom

+0

请允许我澄清一下:图书馆可能会将上下文引用。如果是这样的话,那么只要有上下文,它就会留在记忆中。但是,这对图书馆来说是非常糟糕的设计。 – pgsandstrom

0

我在我的一个图书馆项目中遇到同样的问题。

即使在库项目中,也推荐使用活动上下文。有很多组件只需要活动上下文。例如:对话框。因此,我的建议是将活动上下文从项目传递到库项目。

虽然应用程序上下文可以保存库项目中的序列化问题。

+0

对不起,应该在原始问题中说过,库中没有GUI组件。 – Cullan

+0

比你应该应用上下文。 – vineet