Jawaban dari @ hp.android berfungsi dengan baik jika Anda hanya bekerja dengan latar belakang bitmap tetapi, dalam kasus saya, saya telah BaseAdapter
menyediakan satu set ImageView
s untuk a GridView
. Saya memodifikasi unbindDrawables()
metode seperti yang disarankan sehingga kondisinya adalah:
if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
...
}
tetapi masalahnya kemudian adalah bahwa metode rekursif tidak pernah memproses anak - anak AdapterView
. Untuk mengatasi ini, saya malah melakukan yang berikut:
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();
}
sehingga anak-anak AdapterView
masih diproses - metode ini tidak berusaha untuk menghapus semua anak (yang tidak didukung).
Ini tidak cukup memperbaiki masalah namun karena ImageView
mengelola bitmap yang bukan latar belakang mereka. Karena itu saya menambahkan yang berikut ini. Ini tidak ideal tetapi berfungsi:
if (view instanceof ImageView) {
ImageView imageView = (ImageView) view;
imageView.setImageBitmap(null);
}
Secara keseluruhan unbindDrawables()
metode ini adalah:
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();
}
}
Saya berharap ada pendekatan yang lebih berprinsip untuk membebaskan sumber daya semacam itu.