안드로이드 개발 질문/답변
(글 수 45,052)
제앱이 이미지가 많은편인데요...
A.activity 가 있는데 이곳에는 웹이미지 리스트(listView)입니다. 이곳에서 스크롤 올렸다 내렸다하면서 많은 이미지를 호출합니다.
그런후 profile.Activity로 이동합니다. 이곳에서 프로필 사진을 저장할 수 있는데 이곳에서 갤러를 호출해서 crop한 다음에 저장을 하는곳입니다.
하지만 A.activity에서 이것저것 이미지를 보고 profile.Activity에서 갤러리를 호출하면 자꾸 죽네요..ㅜㅜ..
A.activity에서 이미지들을 거의 보지 않고 profile.Activity에서 갤러리 호출하면 잘되거든요....
네..메모리 부족인데요...
그래서 생각하길 profile.Activity에서 A.activity를 종료하고 싶은데..방법이 찾아봐도 쉽게 검색이 안되네요..
A.activity에 onDestory에 지역변수들을 null처리해서 여기만 타게 하면 될거 같거든요..
아니면 어떻게 메모리를 확보해야될지 다른 방법이 있을까요??
아~ A랑 profile은 TabActivity 서브 Activity라 A에서 profile이동하면 onPause만 호출합니다.

아래는 갤러리 호출후 crop하는 소스의 일부입니다.
(아~~ 코드 하일라이터가 좀 이상하네요..아무리 수정하고 해도 개행문자가 제대로 안먹네요..ㅜㅜ)
//startActivityForResult Call Back 함수protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == CROP_IMAGE && resultCode == RESULT_OK) { //크롭
if(userThumbnailUri != null) { String imgPath = getImageFilePath(userThumbnailUri);
int width = Utils.getBitmapOfWidth(imgPath); int height = Utils.getBitmapOfHeight(imgPath);
BitmapFactory.Options options = new BitmapFactory.Options();
if(width > 3000 || height > 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); src = null;
Log.i(LOGTAG, "CROP_IMAGE(profileNo) : " + profileNo);
selCropFileList.add(new File(imgPath)); //crop 파일 - 추후에 삭제하기 위해 저장
//선택된 파일 전송준비 if(profileNo == 1) {
Profile_Photo1.setImageBitmap(resized); Profile_Photo1.setScaleType(ImageView.ScaleType.FIT_XY);
} else if(profileNo == 2) {
Profile_Photo2.setImageBitmap(resized); Profile_Photo2.setScaleType(ImageView.ScaleType.FIT_XY);
} else if(profileNo == 3) {
Profile_Photo3.setImageBitmap(resized); Profile_Photo3.setScaleType(ImageView.ScaleType.FIT_XY);
} else if(profileNo == 4) {
Profile_Photo4.setImageBitmap(resized); Profile_Photo4.setScaleType(ImageView.ScaleType.FIT_XY);
} }
} else if (requestCode == TAKE_GALLERY && resultCode == RESULT_OK) { //갤러리
try {
Uri imageUri = data.getData();
Log.i(LOGTAG, "TAKE_GALLERY(profileNo) : "+ profileNo);
// 이미지를 가져온 이후의 리사이즈할 이미지 크기를 결정합니다. // 이후에 이미지 크롭 어플리케이션을 호출하게 됩니다. Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(imageUri, "image/*");
/* 잘려진 결과 이미지를 받아오기 위해서 값을 셋팅 하는 부분*/ ContentValues values = new ContentValues(); values.put(Media.TITLE, "comalong_crop_image"); values.put(Media.BUCKET_ID, "User-T"); values.put(Media.BUCKET_DISPLAY_NAME, "image_t"); values.put(Media.IS_PRIVATE, 1);
userThumbnailUri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values); intent.putExtra("output", userThumbnailUri); //결과받을 Uri intent.putExtra("noFaceDetection", false); intent.putExtra("crop", "true"); intent.putExtra("scale", true);
startActivityForResult(intent, CROP_IMAGE);
} catch (Exception e) {
globalMsg = e.getMessage(); alertMsg(globalMsg); }
}
}



안드로이드는 다른어플리케이션을 실행할때 메모리가 부족하면 기존의 액티비티를 상태저장하고 다시 불러오고 있습니다.. 이게 굉장히 짜증나죠.. 어떤프로그램이냐에 따라서 대처법이 틀릴꺼같은데 위의 님이 원하시는 것은
1. A 액티비티를 스태틱으로 잡아서 접근 가능하게 한다.
2. 어플리케이션을 만들어서 컨트롤 할수 있게한다.
등등 많을 꺼같은데 가장 간단한방법은 1번이 되겠네요