Android:引用上下文和内存泄漏

Gui*_*ido 29 android android-context

我已经读过,Android应用程序中的一个错误和内存泄漏源是为了保持对Context的长期引用.

但是我不明白是否可以创建一个看起来像这样的类:

public class HelperClass {
    private Context context;

    public HelperClass(Context context) {
        this.context = context;
    }
    public void myHelperMethod() {
        // uses this.context
    }
}
Run Code Online (Sandbox Code Playgroud)

并从活动中调用它:

public class MyActivity extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        HelperClass h = new HelperClass(this);
        h.myHelperMethod();
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

dby*_*rne 45

这很好,不会导致内存泄漏.

一旦onCreate完成执行,h将超出范围并成为垃圾收集的资格.如果h是静态的,那么你会遇到问题.只有当对上下文的引用超过上下文本身的生命周期时,才会发生内存泄漏.一些有用的提示:

  • Context.getApplicationContext()尽可能使用.只要您的应用程序处于活动状态,此上下文就会存在.
  • 使用静态字段和内部类时要小心.
  • 通过分析器运行您的应用程序以检查泄漏.

  • 如果您的 Activity 中有一个带有此类辅助类的私有变量,该变量包含一个 `Context` 引用,该怎么办? (2认同)
  • @Peterdk如果你的变量是从getApplicationContext()持有Context实例,没问题.但是如果你从一个Activity中持有Context,请注意内存泄漏(更适当地将活动中的实例保存到不需要的位置).也许您应该使用WeakReference来保存Activity上下文实例并使用侦听器来了解您的应用程序何时更改为其他活动. (2认同)

Ebo*_*ike 7

HelperClass的范围仅在onCreate函数中,因此一旦onCreate执行,就不再需要"h"对象并且需要进行垃圾回收.

如果"h"是一个静态成员,这将是一个不同的故事 - 这将是一个泄漏记忆的好方法.