【问题标题】:Android: Unable to destroy activityAndroid:无法销毁活动
【发布时间】:2012-01-14 09:12: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

我该如何解决这个问题?

【问题讨论】:

    标签: android android-activity destroy


    【解决方案1】:

    验证您的 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】:

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

      【讨论】:

      • 我想回收Bitmap,我必须手动做,但是最好的方法是什么?
      • 如果不查看所有源代码,我无法告诉您最好的方法,但您应该在 onDestroy() 中执行此操作并跟踪所有使用的 Bitmap 对象,以便您可以 recycle() 它们。
      【解决方案3】:

      好吧,错误日志几乎解释了它:不要在AdapterView 上调用removeAllViews()。并且您的代码有时会遇到ViewGroup,也就是AdapterView

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

      【讨论】:

      • 知道为什么 AddapterView 不支持此操作吗?我在 AdapterView 的官方参考资料中找不到任何关于它的内容。
      • @r1k0,是的,这是因为 AdapterView 在内部管理其子项。您不能添加/删除它们,因为这可能会破坏其内部状态。
      【解决方案4】:

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

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

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

      【讨论】:

      • onDestroy 调用“liberarMemory()”,这个调用“unbindDrawables(..)”。我必须手动执行以确保 Bitmap 的销毁。
      • 对...但是removeAllViews 不是必需的,在这里可以安全删除
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-31
      • 1970-01-01
      • 2022-10-25
      • 1970-01-01
      相关资源
      最近更新 更多