我刚刚阅读了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.
| 归档时间: |
|
| 查看次数: |
16200 次 |
| 最近记录: |