Відповідь від @ hp.android добре працює, якщо ви просто працюєте з фоном растрових зображень, але, в моєму випадку, у мене був BaseAdapter
набір ImageView
s для 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();
}
}
Я сподіваюся, що існує більш принциповий підхід до звільнення таких ресурсів.