@ 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
sが背景ではないビットマップを管理するため、これで問題が完全に修正されるわけではありません。そこで以下を追加しました。理想的ではありませんが、機能します。
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();
}
}
そのようなリソースを解放するためのより原則的なアプローチがあることを願っています。