Câu trả lời từ @ hp.android hoạt động tốt nếu bạn chỉ làm việc với nền bitmap, nhưng trong trường hợp của tôi, tôi đã BaseAdaptercung cấp một bộ ImageViews cho a GridView. Tôi đã sửa đổi unbindDrawables()phương pháp theo lời khuyên để điều kiện là:
if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
...
}
nhưng vấn đề sau đó là phương pháp đệ quy không bao giờ xử lý con của AdapterView. Để giải quyết vấn đề này, tôi thay vào đó đã làm như sau:
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();
}
để những đứa trẻ AdapterViewvẫn được xử lý - phương pháp không cố gắng loại bỏ tất cả trẻ em (không được hỗ trợ).
Điều này không khắc phục được vấn đề tuy nhiên vì ImageViews quản lý một bitmap không phải là nền tảng của chúng. Do đó tôi đã thêm vào như sau. Nó không lý tưởng nhưng nó hoạt động:
if (view instanceof ImageView) {
ImageView imageView = (ImageView) view;
imageView.setImageBitmap(null);
}
Nhìn chung, unbindDrawables()phương pháp là:
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();
}
}
Tôi hy vọng có một cách tiếp cận nguyên tắc hơn để giải phóng các tài nguyên đó.