0

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であるため、問題ではないようです。

4

1 に答える 1

0

VM の予算を超えても、必ずしもリークがあるとは限りません。大きすぎる単一のビットマップを読み込もうとして、同じ問題を引き起こしました。また、参照を削除すると、とにかくすぐに GC にならず、メモリ不足になる可能性があります。.Recycle必要なときに GC を強制的に実行する方法はないと思いますが、実行時にRecycleビットマップによって保持されているネイティブ参照を解放するので、何らかの形で呼び出す必要があるかもしれません。 GC。

于 2011-08-08T19:10:14.307 に答える