ImageViewを使ってOutOfMemoryが発生するときの対策法

2014年1月21日開発

ImageViewを使って続けて画像を切り替えていると、OutOfMemoryが発生することがあります。

特に、

imgView.setImageResource(drawable_id);

のようにsetImageResourceを使っていると、いずれはOutOfMemoryが発生します。

これに気が付かずに数時間はまりました。

対策としては、setImageBitmapを使ってbitmapを画像にセットすることです。

imageResourceの場合は、開放することができずにメモリを圧迫していきます。

しかしbitmapの場合は、recycle()が存在しています。

bitmapに対してrecycle()を行うことで、メモリが多くなったときにガーベージコレクションで動的にbitmapが開放されます。

private Bitmap myImage;

	Resources resM = getResources();
	if(myImage!=null){
		myImage.recycle();
	}
	myImage = BitmapFactory.decodeResource(resM, drawable_id);
	imgView.setImageDrawable(null);
	imgView.setImageBitmap(null);
	imgView.setImageBitmap(myImage);

正しいのかどうか分かりませんが、念のためimgViewにbitmapをセットする前に、nullで初期化を行っています。

この記述をすることで、実際にメモリがいっぱいになると自動的に解放されることが確認できました。

2014年1月21日開発Bitmap,OutOfMemory

Posted by ラン