Bitmap 関連の OOM を回避しようとして、自分で RootView 内の画像とテキストを個人的にリセットすることを除いて、ViewFlipper を模倣するメニュー システムを作成してきました。昨日まではすべて順調でしたが、数回の再起動とその後のビューの変更の後で、Bitmap Exceeds VM Budget.. または同様のものを取得することに気付きました。割り当てトラッカーを開始し、ダンプされていないものを確認しようとしましたが、これらの呼び出しが問題の原因であることがわかりました。
_stars.setBackgroundDrawable(getResources().getDrawable(R.drawable.star_1));
_button.setBackgroundResource(R.drawable.button_1);
_image.setImageResource(R.drawable.image_1);
これは明らかにすべてのコードではありませんが、トラッカーが次のような多くの割り当てを示している場所です。
258 72 android.graphics.BitmapFactory$Options 1 android.graphics.drawable.Drawable
481 68 android.graphics.drawable.BitmapDrawable 1 android.graphics.drawable.Drawable
482 52 android.graphics.Paint 1 android.graphics.Bitmap createBitmap
479 52 android.graphics.Paint 1 android.graphics.drawable.BitmapDrawable$BitmapState
255 36 android.graphics.Bitmap 1 android.graphics.BitmapFactory
254 36 android.graphics.Canvas 1 android.graphics.Bitmap createBitmap
250 36 android.graphics.Bitmap 1 android.graphics.Bitmap nativeCreate
123 36 android.graphics.Bitmap 1 android.graphics.BitmapFactory
私が疑問に思っているのは、これは正常ですか?それともどこかに漏れがありますか?テスト後の割り当てには、これらのそれぞれが少なくとも10 ~ 20 個あり、最終的には必然的に OOM に到達します。Bitmap 変数を使用してから Bitmap.recycle() を使用する以外にこれを処理する方法がわかりませんが、ビューがまだ使用されているかどうかを確認し、間違ったタイミングでリサイクルする可能性があります。したがって、私はファンではありません。ビューを終了するたびに、これらの割り当てをすべて強制終了する方法を探しています。(すでにコントロールをnull onPause()およびonDestroy()に設定しようとしましたが、ビットマップへの参照を解放し、GCでNO AVAILにできることを期待しています)
[編集]
アクティビティが終了すると、必要に応じて Drawables が処理されることをここで読んだことがあります。したがって、それらに対して recycle を呼び出す必要はありませんか?単一のビットマップのサイズについては、1 つの画像(480w x 720h (x4bpp/8))/1024 = ~169KBであるため、問題ではないようです。