避免Android上的内存泄漏

Jud*_*udy 20 android

我刚刚阅读了Romain Guy关于如何避免Android内存泄漏的博客文章.

在文章中他给出了这个例子:

private static Drawable sBackground;

@Override
protected void onCreate(Bundle state) {
  super.onCreate(state);

  TextView label = new TextView(this);
  label.setText("Leaks are bad");

  if (sBackground == null) {
    sBackground = getDrawable(R.drawable.large_bitmap);
  }
  label.setBackgroundDrawable(sBackground);

  setContentView(label);
}
Run Code Online (Sandbox Code Playgroud)

罗曼说:

这个例子是泄露Context的最简单的例子之一.

我的问题是,你如何正确地修改它?

像这样?

TextView label = new TextView(Context.getApplicationContext());
Run Code Online (Sandbox Code Playgroud)

我测试了两种方式,结果是一样的.我无法找到差异.我认为这this比应用程序上下文更正确.因为this是一个参考Activity,也就是TextView属于那个Activity.

有人可以给我一个解释吗?

Gre*_*ory 17

该代码的实际问题不是传递给创建drawable的上下文,而是私有静态Drawable sBackground; 使用Activity作为上下文创建静态Drawable,因此在这种情况下,有一个引用Activity的Drawable的静态引用,这就是泄漏的原因.只要该引用存在,Activity就会保留在内存中,泄露其所有视图.

所以应该使用应用程序上下文创建Drawable,而不是TextView.使用"this"创建TextView非常好.

编辑:实际上,这可能没有太大的区别,问题是一旦drawable绑定到视图,就会引用该视图,该视图引用该活动.因此,当您退出活动时,您需要"取消绑定"drawable.