旧. -開発日記-

〜とあるプログラマーのつぶやきや開発メモなど〜

Bitmap使用時のOutOfMemoryError

AndroidでBitmapを扱う処理をする際に発生することがあるOutOfMemoryError。
端末によって発生したりしなかったりするようで、
用はサイズの大きいBitmapを使用するとメモリーが
オーバーフローすることがあるわけです。

例えばGalleryからサムネイル画像を選択し、画像データとして取得する際など
何度も繰り返すと上記エラーが発生して落ちてしまいます。
画像切り出しや、解像度を下げるなどで対処する方法もありますが、
簡単にまずは出来る方法として以下があります。



  • Bitmap.recycle()を使用

再度画像を読みこんで表示するといった場合、
画像読み込み時前に

if(bitmap!=null){
 bitmap.recycle();
}

と行った感じで記述。

Bitmapインスタンスに画像がセットされていれば それを解放してやることが出来ます。
なお、BitmapはImageViewなどにセットして表示することが多いと思いますが、
このメモリオーバーはレイアウト指定による画像読み込みの際には発生しません。

JavaコードによるBitmap生成->ImageViewにaddViewする際は
Bitmap.recycle()だけでは対応出来ません。
その場合は以下のようにimageViewで使用している部分も解放してやります。

Drawable drawable = imageView.getDrawable();
if(drawable!= null){
  ((BitmapDrawable)drawable).getBitmap().recycle();
}

GCでは解放タイミングがOSのバージョンなどにいって様々なため、
上記のようにこちらで意図的に解放してやる必要があります。
DalvicVMがメモリ管理を行っており、どのシーンでメモリ使用量が多くなったか、
DDMSであわせて監視して発生個所を調べてみるのもいいと思います。

本日はこれぐらいにて...。