10

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

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

4 回答 4

11

好吧,错误日志几乎解释了它:不要调用removeAllViews(). 而且您的代码在某些时候也AdapterView遇到了.ViewGroupAdapterView

只需使用/包装器instanceof检查或处理异常来排除这种情况。trycatch

于 2011-12-06T19:25:13.013 回答
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();
}
于 2013-01-24T12:48:22.987 回答
0

去掉那条线?或者至少检查是否支持该操作trycatch

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

你把这一切都叫进来了onDestroy吗?如果是这样,这样做有好处吗?我的印象是系统会为你处理这种事情。

于 2011-12-06T19:24:35.823 回答
0

不要叫它。UnsupportedOperationException 告诉您此方法不受支持或无法正常工作,因此您必须以另一种方式完成任务。无论如何,我认为没有必要调用它,因为垃圾收集器将处理此任务。如果您需要确保完成位图回收,则应手动完成。

于 2011-12-06T19:29:52.680 回答