Android:无法销毁活动

时间:2011-12-06 19:17:27

标签: android android-activity destroy

我使用以下代码删除每个视图组上的子项:

protected void onDestroy() {
    super.onDestroy();
    this.liberarMemoria();
}

public void liberarMemoria(){
     imagenes.recycleBitmaps(); 
     this.unbindDrawables(findViewById(R.id.RelativeLayout1));
     System.gc();
}
private void unbindDrawables(View view) {
    if (view.getBackground() != null) {
    view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup) {
    for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
        unbindDrawables(((ViewGroup) view).getChildAt(i));
    }
    ((ViewGroup) view).removeAllViews();
    }
}

其中视图:R.id.RelativeLayout1是ListView。

但是这样做我有例外:

E/AndroidRuntime(582): java.lang.RuntimeException: Unable to destroy activity {...}: java.lang.UnsupportedOperationException: removeAllViews() is not supported in AdapterView

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:11)

好吧,错误日志几乎解释了这一点:不要在removeAllViews()上致电AdapterView。您的代码在某些时候符合ViewGroup,也是AdapterView

使用instanceof检查或处理try / catch包装器的异常来判断此情况。

答案 1 :(得分:7)

验证您的ViewGroup是否不是AdapterView的实例。

做类似的事情:

if (!(view instanceof AdapterView<?>))
    ((ViewGroup) view).removeAllViews();

所以,在你的代码上:

if (view instanceof ViewGroup) {
    for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
        unbindDrawables(((ViewGroup) view).getChildAt(i));
    }
    if (!(view instanceof AdapterView<?>))
        ((ViewGroup) view).removeAllViews();
}

答案 2 :(得分:0)

删除该行?或至少检查trycatch是否支持该操作。

另外,想要在名为unbindDrawables的方法中完全执行此操作有点令人困惑,除非它只是一个命名错误的方法(并没有完整地描述它的作用)。

您是否在onDestroy中调用了所有这些内容?如果是这样,这样做会有好处吗?我的印象是系统会为你处理这类事情。

答案 3 :(得分:0)

不要打电话。 UnsupportedOperationException告诉您此方法不受支持或不起作用,因此您必须以另一种方式完成任务。无论如何我都不需要调用它,因为垃圾收集器将处理此任务。如果您需要确保完成位图回收,请手动完成。