【问题标题】:Android : References to a Context and memory leaksAndroid:对上下文的引用和内存泄漏
【发布时间】:2010-07-27 17:12:33
【问题描述】:

我了解到,在 Android 应用程序中保持对 Context 的长期引用是一个错误和内存泄漏的来源。

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

public class HelperClass {
    private Context context;

    public HelperClass(Context context) {
        this.context = context;
    }
    public void myHelperMethod() {
        // uses this.context
    }
}

并从 Activity 中调用它:

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

    ...
}

【问题讨论】:

    标签: android android-context


    【解决方案1】:

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

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

    • 尽可能使用Context.getApplicationContext()。只要您的应用程序存在,此上下文就会存在。
    • 使用静态字段和内部类时要小心。
    • Run your application through a profiler 检查是否有泄漏。

    【讨论】:

    • 如果你的 Activity 中有一个带有这样一个辅助类的私有变量,它包含一个 Context 引用怎么办?
    • @Peterdk 如果你的变量持有来自 getApplicationContext() 的 Context 实例,没问题。但是,如果您从 Activity 中保存 Context,请注意内存泄漏(更恰当地从 Activity 中保存实例而不是需要)。也许您应该使用 Wea​​kReference 来保存 Activity 上下文实例并使用侦听器来了解您的应用程序何时更改为其他 Activity。
    【解决方案2】:

    HelperClass 的范围仅在您的 onCreate 函数内,因此一旦 onCreate 执行,您的“h”对象就不再需要并受到垃圾回收的影响。

    如果“h”是一个静态成员,那将是一个不同的故事 - 这将是泄漏内存的好方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 2013-11-25
      • 1970-01-01
      相关资源
      最近更新 更多