OOM エラーが発生するか、Canvas がリサイクルされたビットマップ エラーを描画しようとするかを交互に繰り返します。ここでどちらが最善のアプローチであるかはわかりませんが、いくつかの情報をいただければ幸いです。いくつかの画像が表示されたホームスクリーンがあります。このように処理すると、画面に再度ロードするたびに OOM エラーが発生します。
@Override
protected void onDestroy() {
super.onDestroy();
recycleHomescreenImages();
unbindDrawables(findViewById(R.id.homescreen_root_view));
System.gc();
}
private void unbindDrawables(View view) {
if (view.getBackground() != null) {
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
}
ホーム画面の画像が適切に再利用されていないようです。ただし、unbindDrawables(View view) メソッドを次のように変更すると、Canvas がリサイクルされたビットマップ エラーを使用しようとします。
private void unbindDrawables(View view) {
if (view.getBackground() != null) {
view.getBackground().setCallback(null);
if (view.getBackground() instanceof BitmapDrawable)
((BitmapDrawable)view.getBackground()).getBitmap().recycle();
}
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
}
ご意見をお寄せいただきありがとうございます。さらに情報が必要な場合はお知らせください。
編集:さらに混乱するのは、最初にアクティビティを再開した後、リサイクルされたビットマップを使用して Canvas を取得しないという事実ですが、2 回目にアクティビティを再開した場合のみです。