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 đã BaseAdapter
cung cấp một bộ ImageView
s 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ẻ AdapterView
vẫ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ì ImageView
s 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 đó.