防止Android中的内存泄漏

时间:2017-11-09 02:06:42

标签: java android memory-leaks android-context

通过获取Application上下文,在每个需要Context的Activity中获取对Context对象的引用是否明智?我已经知道它可以创建内存泄漏来抛出Activity的上下文对象,但是当你创建复杂的Activity时,似乎几乎总是需要Context对象。我之前在Activity类的顶部声明了一个Context变量,并使用onCreate中的“this”关键字对其进行初始化。我已经知道这可能是糟糕的形式,但是可以在onCreate调用getApplicationContext()初始化Context对象吗?换句话说,这有助于解决我的问题。

另外,限制静态变量的使用是否更好?如果我没有弄错,如果我调用静态方法,或者引用来自不同Activity的静态变量,那么将不会将其他Activity保留在内存中吗?

2 个答案:

答案 0 :(得分:0)

  1. 您的Context中确实不需要Activity字段,因为您始终可以使用getBaseContext()getApplicationContext()或{{来获取上下文1}}(因为活动本身就是上下文)。

  2. 如果您希望让this课程变薄,则可能必须将Context传递给其他课程。只要这些类的生命周期与Activity的生命周期相同,这就完全可以了。这意味着,当您的Activity被销毁时,任何对象都不应该引用您传递的上下文。

  3. 静态方法非常好,只要它们不引用静态字段即可。如果没有状态,请使用静态方法。由于很多原因,静态场是危险的。因此,仅在正确的情况下使用它们。

答案 1 :(得分:0)

我认为您需要了解应用程序上下文和活动上下文之间的差异,请参阅the answer here

  

但是在onCreate中调用getApplicationContext()初始化Context对象是否可以?换句话说,这有助于解决我的问题。

为什么需要初始化上下文对象?活动本身已经是一个背景。例如:

    Intent intent = new Intent(this, MainActivity.class);

您不需要从应用程序上下文初始化上下文,因为活动上下文具有更多功能。请参阅此link

  

另外,限制静态变量的使用是否更好?如果我没有弄错,如果我调用静态方法,或者引用来自不同Activity的静态变量,是否也不会将其他Activity保留在内存中?

要将数据从一个活动发送到另一个活动,您可能需要parcelable object and bundleEvent Bus来解除发件人/收件人的活动。

对于静态方法,您可能需要将它们分组到Utility类下。