Odpowiedź z @ hp.android działa dobrze, jeśli pracujesz tylko z tłem bitmapowym, ale w moim przypadku miałem BaseAdapter
zestaw ImageView
s 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 AdapterView
są 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ż ImageView
s 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.