본문 바로가기
안드로이드+자바

안드로이드 OutOfMemoryError 해결!

by 문자메일 2017. 1. 20.
bitmaps[1] = BitmapFactory.decodeResource(getResources(), R.drawable.cc);
bitmaps[2] = BitmapFactory.decodeResource(getResources(), R.drawable.bb);
bitmaps[3] = BitmapFactory.decodeResource(getResources(), R.drawable.bb);
bitmaps[4] = BitmapFactory.decodeResource(getResources(), R.drawable.cc);
bitmaps[5] = BitmapFactory.decodeResource(getResources(), R.drawable.cc);
bitmaps[6] = BitmapFactory.decodeResource(getResources(), R.drawable.bb);
bitmaps[7] = BitmapFactory.decodeResource(getResources(), R.drawable.bb);
bitmaps[8] = BitmapFactory.decodeResource(getResources(), R.drawable.cc);

이런식으로 마구잡이로 비트맵 이미지를 할당하다보니 OutOfMemoryError 예외가 터져버렸다..


원인을 찾아보니 너무 큰 이미지를 많이 불러와서 hip memory의 용량을 초과해서 문제가 생긴 것이였다.


이에 대한 해결책으로 BitmapFactory.Options을 사용하여 이미지의 크기를 줄이는 방법을 발견했다.


//이 부분은 이미지의 사이즈를 줄여서 힙 메모리 초과로 앱이 종료되는걸 막기 위함이다.
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4; // 1/4만큼 이미지를 줄여서 decoding 하겠다 라는 뜻

Bitmap src = BitmapFactory.decodeResource(getResources(), R.drawable.aaa, options);
bitmaps[1] = Bitmap.createScaledBitmap(src, width/2, height/2, true);

options.inSampleSize에 8을 넣으면 이미지를 기존 크기에서 1/8로 줄여서 decoding 한다는 뜻이다.


만든 옵션을 BitmapFactory.decodeResource( _ , _, option); 에 줘서 비트맵을 만들고,


Bitmap.createScaledBitmap( 비트맵이미지, 이미지 가로길이, 이미지 세로길이, 옵션) 으로 원하는 크기의 이미지를 생성한다. 옵션을 true로 줄경우 pixel을 조정하여 이미지를 더 선명하게 보이도록 도움을 주나 많이 큰 이미지에 사용하면 OutOfMemoryError가 터질 수 있으니 주의하자!



댓글