안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요... 이미지view app을 만들고 있는데...갤러리 같은거에요..
sd card에 있는 많은 이미지를 보다보면 out of memory가 발생하네요..ㅜㅜ
이미지 display할때 사용하는 함수는 아래와 같아요..
private void displayImage() {
Bitmap mCurrentSelectedImageFile1 = BitmapFactory.decodeFile(mCurrentSelectedFilePath);
mFullImageView.setScaleType(ScaleType.CENTER);
mFullImageView.setImageBitmap(mCurrentSelectedImageFile1);
}
Bitmap mCurrentSelectedImageFile1 여기서 문제가 생겨요..
어떻게 해야할까요?!!
또 android에서는 강제적으로 heap memory를 해제 하는것이 없나요?!!
에러 로그는 아래와 같아요..
07-30 11:06:38.944: ERROR/dalvikvm-heap(8755): 393216-byte external allocation too large for this process.
07-30 11:06:38.944: ERROR/(8755): VM won't let us allocate 393216 bytes
07-30 11:06:38.944: DEBUG/AndroidRuntime(8755): Shutting down VM
07-30 11:06:38.944: WARN/dalvikvm(8755): threadid=3: thread exiting with uncaught exception (group=0x4000fe70)
07-30 11:06:38.944: ERROR/AndroidRuntime(8755): Uncaught handler: thread main exiting due to uncaught exception
07-30 11:06:39.164: INFO/ActivityManager(77): Process android.process.media (pid 8301) has died.
07-30 11:06:39.224: ERROR/AndroidRuntime(8755): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
07-30 11:06:39.224: ERROR/AndroidRuntime(8755): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
07-30 11:06:39.224: ERROR/AndroidRuntime(8755): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:375)
07-30 11:06:39.224: ERROR/AndroidRuntime(8755): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:171)
07-30 11:06:39.224: ERROR/AndroidRuntime(8755): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:196)
07-30 11:06:39.224: ERROR/AndroidRuntime(8755): at PhotoAlbum.com.FullImagedisplay.displayImage(FullImagedisplay.java:127)
07-30 11:06:39.224: ERROR/AndroidRuntime(8755): at PhotoAlbum.com.FullImagedisplay.moveToNextImage(FullImagedisplay.java:460)
07-30 11:06:39.224: ERROR/AndroidRuntime(8755): at PhotoAlbum.com.FullImagedisplay.onClick(FullImagedisplay.java:369)
07-30 11:06:39.224: ERROR/AndroidRuntime(8755): at android.view.View.performClick(View.java:2179)
07-30 11:06:39.224: ERROR/AndroidRuntime(8755): at android.view.View.onTouchEvent(View.java:3828)
07-30 11:06:39.224: ERROR/AndroidRuntime(8755): at android.view.View.dispatchTouchEvent(View.java:3368)
07-30 11:06:39.224: ERROR/AndroidRuntime(8755): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
07-30 11:06:39.224: ERROR/AndroidRuntime(8755): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
07-30 11:06:39.224: ERROR/AndroidRuntime(8755): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
07-30 11:06:39.224: ERROR/AndroidRuntime(8755): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
07-30 11:06:39.224: ERROR/AndroidRuntime(8755): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1707)
07-30 11:06:39.224: ERROR/AndroidRuntime(8755): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1197)
07-30 11:06:39.224: ERROR/AndroidRuntime(8755): at android.app.Activity.dispatchTouchEvent(Activity.java:1993)
07-30 11:06:39.224: ERROR/AndroidRuntime(8755): at PhotoAlbum.com.FullImagedisplay.dispatchTouchEvent(FullImagedisplay.java:244)
07-30 11:06:39.224: ERROR/AndroidRuntime(8755): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1691)
07-30 11:06:39.224: ERROR/AndroidRuntime(8755): at android.view.ViewRoot.handleMessage(ViewRoot.java:1525)
07-30 11:06:39.224: ERROR/AndroidRuntime(8755): at android.os.Handler.dispatchMessage(Handler.java:99)
07-30 11:06:39.224: ERROR/AndroidRuntime(8755): at android.os.Looper.loop(Looper.java:123)
07-30 11:06:39.224: ERROR/AndroidRuntime(8755): at android.app.ActivityThread.main(ActivityThread.java:3948)
07-30 11:06:39.224: ERROR/AndroidRuntime(8755): at java.lang.reflect.Method.invokeNative(Native Method)
07-30 11:06:39.224: ERROR/AndroidRuntime(8755): at java.lang.reflect.Method.invoke(Method.java:521)
07-30 11:06:39.224: ERROR/AndroidRuntime(8755): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
07-30 11:06:39.224: ERROR/AndroidRuntime(8755): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
07-30 11:06:39.224: ERROR/AndroidRuntime(8755): at dalvik.system.NativeStart.main(Native Method)
2009.07.30 13:43:30
^^.. 갤러리 같이 listview에 sdcard에 있는 모든 image을 보여주고, user가 그중 하나를 선택하면 원본 크기로 보여줍니다.
그리고 원본 크기 view에서 next image를 선택하면 다음 이미지를 원본크기로 보여주는 그런 app을 만들고 있습니다.
이미, image list를 배열에 이미지 index가 저장 되어 있습니다.
거의 갤러리 app이랑 같이 구성되어 있습니다.
원본 크기로 보여주는 이미지 뷰에서 계속 다음 이미지 보여주기를 선택하면 결국은 out of memory가 되더라구요 ㅡㅡ..
options.inSampleSize = 2;
이런식으로 옵션을 주고 만들면 줄어든 크기를 불러올수 있습니다.
원래 크기가 작은 파일이라면 모르겠지만 아니라면 하나의 방법이 될수 있을꺼 같네요.
아래 출처부분을 보시면 자세한 내용이 있습니다.
출처 : http://blog.naver.com/visualc98/79874750 (kandroid 비즈페이님)