Ответ от @hp.android хорошо работает, если вы просто работаете с растровыми фонами, но в моем случае у меня был BaseAdapter, предоставляющий набор ImageView для 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();
}
}
Я надеюсь, что есть более принципиальный подход к высвобождению таких ресурсов.
person
darrenp
schedule
29.08.2013