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であわせて監視して発生個所を調べてみるのもいいと思います。
本日はこれぐらいにて...。