Ответ от @ 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();
}
}
Я надеюсь, что есть более принципиальный подход к освобождению таких ресурсов.