안드로이드 개발 질문/답변
(글 수 45,052)
불러올때 1/4 크기로 줄여서 불러오니 OutOfMemory 에러는 없습니다..
근데 문제는 갤러리에서 사진을 선택하면 갤러리를 호출한 Activity 가 강제종료 되고 재시작이 되버립니다..-_-;;
해당 Activity는 시작시 많은 일을 하거든요..그걸 다시 반복하네요..ㅜㅜ
물론 자주 그러진 않고 간혹 그러는데..
아무래도 다른 어플들을 사용중이거나 메모리 공간이 넉넉하지 않을때.. --> 이건 추측입니다..
이런 현상이 나오는거 같은데요..
이런경우는 어떻게 처리해야되나요??
혹시 갤러리 호출할때 newtask 옵션으로 호출해서 그런가요...
2011.05.17 13:17:02
올리신 질문을 보니 네트워크를 이용하여 서버에서 사진을 받아오는거 같은데
서버에 작은사이즈의 사진과 큰사이즈를 준비해 놓으시고 처음에는 작은 사이즈의 이미지를 보여주시고
이벤트가 발생했을 때 큰 이미지를 로딩 하시는 식으로 하시면 구현 하시면 좀 더 나아지지 않을까요?
이미지 수신할때 buffer 사이즈도 적당히 정해주셔야겠죠...?!
2011.05.17 13:39:08
그건 파일을 읽으 실때 버퍼 사이즈를 너무 많이 정해서 그러신것 같은데 그부분을 한번 체크해보세요.
그부분은 소스를 보지 않고는 답변해드리기가 힘들듯 싶습니다. ^^
2011.05.17 14:09:03
논뚜렁님 답변 감사합니다.
아래 소스인데 좀 한번 봐주시면 감사하겠습니다.
Uri imageUri = data.getData();
String imgPath = getImageFilePath(imageUri);
/*
* 겔러리에서 받아온 이미지가 너무 크면 Out of Memory 가 발생함으로 1/4로 스케일 해준다.
*/
int width = Utils.getBitmapOfWidth(imgPath); //여기에서 쓰이는 함수는 아래에 있어요..
int height = Utils.getBitmapOfHeight(imgPath); //여기에서 쓰이는 함수는 아래에 있어요..
BitmapFactory.Options options = new BitmapFactory.Options();
if(width > 3000) {
options.inSampleSize = 8; //option을 사용해야 out of Memory가 발생이 안됨.
} else {
options.inSampleSize = 4; //option을 사용해야 out of Memory가 발생이 안됨.
}
Bitmap src = BitmapFactory.decodeFile(imgPath, options);
Bitmap resized = Bitmap.createScaledBitmap(src, 70, 70, true);
selected_Profile_Photo.setImageBitmap(resized);
selected_Profile_Photo.setScaleType(ImageView.ScaleType.FIT_XY);
/** Get Bitmap's Width **/
public static int getBitmapOfWidth( String fileName ){
try {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(fileName, options);
return options.outWidth;
} catch(Exception e) {
return 0;
}
}
/** Get Bitmap's height **/
public static int getBitmapOfHeight( String fileName ){
try {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(fileName, options);
return options.outHeight;
} catch(Exception e) {
return 0;
}
}




2.2에서는 어플이 메모리 점유율이 높으면 내부적으로 순위가 낮은것부터 종료시키고 (메모리가 부족할 경우)
2.3에서부터는 cpu점유율에 따라 종료 시키는것으로 알고 있습니다....