Відповідь від @ hp.android добре працює, якщо ви просто працюєте з фоном растрових зображень, але, в моєму випадку, у мене був BaseAdapterнабір ImageViews для a GridView. Я змінив unbindDrawables()метод, як радили, щоб умова:
if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
...
}
але проблема полягає в тому, що рекурсивний метод ніколи не обробляє дітей AdapterView. Щоб вирішити це, я натомість зробив наступне:
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();
}
щоб діти AdapterViewвсе ще оброблялися - метод просто не намагається видалити всіх дітей (що не підтримується).
Однак це не зовсім вирішує проблему, оскільки ImageViewкеруємо растровою картою, яка не є їхнім фоном. Тому я додав наступне. Це не ідеально, але це працює:
if (view instanceof ImageView) {
ImageView imageView = (ImageView) view;
imageView.setImageBitmap(null);
}
Загальний unbindDrawables()метод тоді:
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();
}
}
Я сподіваюся, що існує більш принциповий підхід до звільнення таких ресурсів.