0

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 回目にアクティビティを再開した場合のみです。

4

0 に答える 0