Android:无法销毁活动。

10

我正在使用以下代码来移除每个ViewGroup中的子项:

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个回答

11

好的,错误日志已经很清楚地解释了:不要在AdapterView上调用removeAllViews()。而你的代码在某个时候会遇到同样也是AdapterViewViewGroup

可以使用instanceof检查或使用try/catch包装器处理异常来排除这种情况。


1
你有什么想法为什么AddapterView不支持这个操作吗?我在AdapterView的官方参考文献中找不到任何相关信息。 - r1k0
@r1k0,是的,这是因为AdapterView在内部管理其子项。您不能添加/删除它们,因为这可能会破坏其内部状态。 - inazaruk

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();
}

0

删除那一行?或者至少使用trycatch检查该操作是否被支持。

此外,在名为unbindDrawables的方法中想要执行此操作有点令人困惑,除非这只是一个命名不当的方法(没有完全描述它的功能)。

您是在onDestroy中调用所有这些吗?如果是这样,这样做有什么好处吗?我认为系统会为您处理这种情况。


在onDestroy中调用"liberarMemoria()",并调用"unbindDrawables(..)"。我必须手动执行以确保Bitmap的销毁。 - android iPhone
没错...但是removeAllViews不是必要的,可以在这里安全地删除。 - skynet

0

不要调用它。UnsupportedOperationException告诉你这个方法不被支持或者不可用,所以你需要另外找到完成任务的方式。我并不认为有必要去调用它,因为垃圾回收器会处理这个任务。如果你需要确保Bitmap回收被执行,那么应该手动进行回收。


我想回收Bitmap,但必须手动完成,那么最好的方法是什么? - android iPhone
我无法在没有查看您的全部源代码的情况下告诉您最佳方法,但您应该在 onDestroy() 中完成,并跟踪使用的所有 Bitmap 对象,以便可以对它们进行 recycle() - Dan S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接