Odpowiedź z @ hp.android działa dobrze, jeśli pracujesz tylko z tłem bitmapowym, ale w moim przypadku miałem BaseAdapterzestaw ImageViews dla a GridView. Zmodyfikowałem unbindDrawables()metodę zgodnie z zaleceniami, aby warunek był następujący:
if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
...
}
ale problem polega na tym, że metoda rekurencyjna nigdy nie przetwarza elementów potomnych AdapterView. Aby rozwiązać ten problem, zamiast tego wykonałem następujące czynności:
if (view instanceof ViewGroup) {
ViewGroup viewGroup = (ViewGroup) view;
for (int i = 0; i < viewGroup.getChildCount(); i++)
unbindDrawables(viewGroup.getChildAt(i));
if (!(view instanceof AdapterView))
viewGroup.removeAllViews();
}
tak, że elementy podrzędne AdapterViewsą nadal przetwarzane - metoda po prostu nie próbuje usunąć wszystkich elementów podrzędnych (co nie jest obsługiwane).
Nie rozwiązuje to jednak problemu, ponieważ ImageViews zarządzają bitmapą, która nie jest ich tłem. Dlatego dodałem, co następuje. Nie jest idealny, ale działa:
if (view instanceof ImageView) {
ImageView imageView = (ImageView) view;
imageView.setImageBitmap(null);
}
Ogólnie unbindDrawables()metoda jest następująca:
private void unbindDrawables(View view) {
if (view.getBackground() != null)
view.getBackground().setCallback(null);
if (view instanceof ImageView) {
ImageView imageView = (ImageView) view;
imageView.setImageBitmap(null);
} else if (view instanceof ViewGroup) {
ViewGroup viewGroup = (ViewGroup) view;
for (int i = 0; i < viewGroup.getChildCount(); i++)
unbindDrawables(viewGroup.getChildAt(i));
if (!(view instanceof AdapterView))
viewGroup.removeAllViews();
}
}
Mam nadzieję, że istnieje bardziej zasadnicze podejście do uwolnienia takich zasobów.