Q1.你已经把它从上下文中(不开玩笑了:)
如果您看到原始文章,则泄漏实际上发生在引入Bitmap字段的下一个代码片段中.罗马然后清楚地解释为什么它泄漏.您显示的代码不会泄漏.
Q2.仅在没有其他选择的情况下使用活动上下文,并且不允许在范围大于其引用的活动范围的范围内引用它.您所显示的代码不会泄漏到我可以看到,因为没有一个上下文引用的范围大于您的Activity.你怀疑它是吗?
Q3.当使用Bitmap,静态引用时,我习惯于解除onPause()中的Views的Bitblock(记住onDestroy())是不能保证的,但它是无关紧要的,就像被破坏一样,你的进程被杀死,所以GC不是关心).链接的文章还解释了如何做到这一点.我已经做了一个模板模式,我的任何活动处理位图.
[编辑]
对不起,我刚刚检查.该文章没有显示如何取消绑定.这是我使用的模式:
@Override
protected void onPause()
{
super.onPause();
unbindDrawables(findViewById(R.id.mainLayout));
System.gc();
}
@Override
protected void onDestroy()
{
super.onDestroy();
unbindDrawables(findViewById(R.id.mainLayout));
System.gc();
}
private void unbindDrawables(View view)
{
if (view.getBackground() != null)
{
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup && !(view instanceof AdapterView))
{
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++)
{
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
}
mainLayout是活动布局的根视图.
我包括onDestroy(),因为我可以手动完成()我的活动.
注意.调用system.gc()是一个复杂的主题,你可能想要省略它.在这里有一些很好的讨论,为什么这不是一件好事,主要关心的是表现.但是,在我看来,当一个活动被销毁时,暗示现在是执行GC的好时机,不会有任何伤害.在不必要地调用它的低效率将在销毁活动的间接费用中丢失.