Reputation: 880
I am using the following code to removes childs on every 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();
}
}
where the view: R.id.RelativeLayout1 is a ListView.
But doing this I have en exception:
E/AndroidRuntime(582): java.lang.RuntimeException: Unable to destroy activity {...}: java.lang.UnsupportedOperationException: removeAllViews() is not supported in AdapterView
How can I solve this?
Upvotes: 10
Views: 15060
Reputation: 7156
Verify if your ViewGroup isn't a instance of AdapterView.
Do something like that:
if (!(view instanceof AdapterView<?>))
((ViewGroup) view).removeAllViews();
So, on your code:
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();
}
Upvotes: 7
Reputation: 9189
Don't call it. UnsupportedOperationException is telling you that this method is not supported or functional so you'll have to accomplish the task another way. I don't see the need in calling this anyway as the garbage collector will handle this task. Bitmap recycling should be done manually if you need to ensure it being done.
Upvotes: 0
Reputation: 74790
Well, the error log pretty much explains it: do not call removeAllViews()
on AdapterView
. And your code at some point meets ViewGroup
that also is AdapterView
.
Just rule this case out using instanceof
check or handle exception with try
/catch
wrapper.
Upvotes: 11
Reputation: 9908
Remove that line? Or at least check if the operation is supported with try
and catch
.
Also, it is a bit confusing to want to do this at all in a method called unbindDrawables
, unless it is just a badly named method (doesn't describe what it does fully).
Are you calling all of this in onDestroy
? If so, is there benefit from doing this? I was under the impression that the system takes care of this sort of thing for you.
Upvotes: 0