현재 A,B,C 세개의 액티비티로 되어있습니다.
A는 1M B는 2M C는 5M 정도의 이미지를 사용하다보니
A->B->C->B->C 를 하면 메모리가 15M 정도 쌓이게 되네요..
액티비티를 배열에 저장해서 종료해줬는데 메모리와는 별개의 문제인거 같더라구요
recycle을 통해서 이미지를 빼줘야 하나요? GC가 자체적으로 해결해주는줄 알았는데
일정 이상 쌓이면 죽어버립니다.ㅠㅠ
BitmapFactory.options 을 이용해서 불러와 보세요
new 로 생성하시고 생성된 객체에 options.inPurgeable = true;
를 주시면 메모리 반환 요구시 반환하는걸로 알고 있습니다.
그리고 사악미소님 말씀처럼... WVGA장비일 경우 480*800 인데... 커봐야 150kb입니다...
메모리에 올라간다면 ARGB8888(8*4) = 32bit = 4byte
4*480*800 = 1,536,000 byte
를 사용합니다... 이미지 파일 자체가 5mb라면....메모리에... ㅎㄷㄷ.... 안죽는게 싱기한거죵
아래는 제가 사용하는 비트맵 파일 디코더입니다. 맥스 사이즈는 480*800 이라면 루트해서 620 정도 입력하시면 됩니다.
public static Bitmap SafeDecodeBitmapFile(String strFilePath,
int maxImagePixelSize) {
File file = new File(strFilePath);
if (file.exists() == false) { return null; }
// 가로, 세로 최대 크기 (이보다 큰 이미지가 들어올 경우 크기를 줄인다.)
final int IMAGE_MAX_SIZE = maxImagePixelSize;
// 비트맵팩토리 옵션
BitmapFactory.Options bfo = new BitmapFactory.Options();
bfo.inJustDecodeBounds = true;
BitmapFactory.decodeFile(strFilePath, bfo);
if (bfo.outHeight * bfo.outWidth >= IMAGE_MAX_SIZE * IMAGE_MAX_SIZE) {
bfo.inSampleSize = (int) Math.pow(
2,
(int) Math.round(Math.log(IMAGE_MAX_SIZE
/ (double) Math.max(bfo.outHeight, bfo.outWidth))
/ Math.log(0.5)));
}
bfo.inJustDecodeBounds = false;
bfo.inPurgeable = true;
bfo.inDither = true;
bfo.inPreferredConfig = Bitmap.Config.ARGB_4444;
final Bitmap bitmap = BitmapFactory.decodeFile(strFilePath, bfo);
return bitmap;
}




B->C intent 할때 putExtra 같은 것으로 B에서 실행했다는 정보를 같이 보내고
B를 finish하고 C에서 뒤로가기 키가 눌릴 때 받은 Extra 정보에 해당하는
B Activity를 intent로 다시 불러주면 스택이 쌓이는 문제가 해결될겁니다.
그리고 이미지 사이즈가 5메가라는 건 너무 큰듯 합니다. RGBA * 1092 * 1024 해상도 영상도 4메가면 되는데.
이미지가 여러개 겹쳐있더라도 5메가라는 좀 심한 듯 합니다.
사이즈 최적화를 권장해드립니다.