我使用以下代码删除每个视图组上的子项:
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
我该如何解决这个问题?
答案 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)
删除该行?或至少检查try
和catch
是否支持该操作。
另外,想要在名为unbindDrawables
的方法中完全执行此操作有点令人困惑,除非它只是一个命名错误的方法(并没有完整地描述它的作用)。
您是否在onDestroy
中调用了所有这些内容?如果是这样,这样做会有好处吗?我的印象是系统会为你处理这类事情。
答案 3 :(得分:0)
不要打电话。 UnsupportedOperationException告诉您此方法不受支持或不起作用,因此您必须以另一种方式完成任务。无论如何我都不需要调用它,因为垃圾收集器将处理此任务。如果您需要确保完成位图回收,请手动完成。