12-28 15:39:00.790: E/AndroidRuntime(27973): FATAL EXCEPTION: main
12-28 15:39:00.790: E/AndroidRuntime(27973): java.lang.OutOfMemoryError
12-28 15:39:00.790: E/AndroidRuntime(27973): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
12-28 15:39:00.790: E/AndroidRuntime(27973): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:587)
12-28 15:39:00.790: E/AndroidRuntime(27973): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:445)
12-28 15:39:00.790: E/AndroidRuntime(27973): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:773)
12-28 15:39:00.790: E/AndroidRuntime(27973): at android.graphics.drawable.Drawable.createFromStream(Drawable.java:733)
12-28 15:39:00.790: E/AndroidRuntime(27973): at android.widget.ImageView.resolveUri(ImageView.java:562)
12-28 15:39:00.790: E/AndroidRuntime(27973): at android.widget.ImageView.setImageURI(ImageView.java:340)
12-28 15:39:00.790: E/AndroidRuntime(27973): at com.andro.clapp.TeleForm.onCreate(TeleForm.java:157)
12-28 15:39:00.790: E/AndroidRuntime(27973): at android.app.Activity.performCreate(Activity.java:4465)
12-28 15:39:00.790: E/AndroidRuntime(27973): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052)
12-28 15:39:00.790: E/AndroidRuntime(27973): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1932)
12-28 15:39:00.790: E/AndroidRuntime(27973): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993)
12-28 15:39:00.790: E/AndroidRuntime(27973): at android.app.ActivityThread.access$600(ActivityThread.java:127)
12-28 15:39:00.790: E/AndroidRuntime(27973): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1159)
12-28 15:39:00.790: E/AndroidRuntime(27973): at android.os.Handler.dispatchMessage(Handler.java:99)
12-28 15:39:00.790: E/AndroidRuntime(27973): at android.os.Looper.loop(Looper.java:137)
12-28 15:39:00.790: E/AndroidRuntime(27973): at android.app.ActivityThread.main(ActivityThread.java:4507)
12-28 15:39:00.790: E/AndroidRuntime(27973): at java.lang.reflect.Method.invokeNative(Native Method)
12-28 15:39:00.790: E/AndroidRuntime(27973): at java.lang.reflect.Method.invoke(Method.java:511)
12-28 15:39:00.790: E/AndroidRuntime(27973): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
12-28 15:39:00.790: E/AndroidRuntime(27973): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
12-28 15:39:00.790: E/AndroidRuntime(27973): at dalvik.system.NativeStart.main(Native Method)
한 폼안에 버튼을 누르면 intent한 내장갤러리로 이동하여 사진 선택 시
파일을 생성합니다. 이 파일에는 선택한 사진의 uri가 들어있구요
따라서 그 파일을 읽어 uri를 img.setImageURI(uri1); 와 smslayout.addView(img);
이렇게하여 띄우게 되는데요 사진을 3개 이상 띄우고 폼을 들어가보면 저런 로그를 띄우고 죽더라구요..
메모리부족이라고 뜨는거 봐서 메모리에 문제가 있는 것 같은데 고작 이미지 몇장 띄었다고 저렇게 되는건지..
아시는분 도움좀 주세요~
소스 이미지를 어디에 어떻게 뿌리는지가 중요한게 아니라 소스 이미지를 로드하는 행위(?) 자체가 문제(??)가 됩니다.
예를 들어 가로 1000 세로 1000 이미지를 말씀하신 것 처럼 가로, 세로 80 by 80 공간에 출력한다고 하더라도 메모리 상에는 일단 1000 x 1000 이미지가 로드 되겠지요...(실제 그렇습니다.)
이런 문제 때문에 실제 폰에 있는 갤러리에서도 실제 원본 이미지를 그대로 로드하여 그리드로 보여주는 것 이 아니라 샘플링 하여 보여주고 있습니다.
그리고 JVM heap 이야기는 괜히 꺼낸 듯 하지만...
HiruMaa 님께서 만드신 어플이든 제가 만든 어플이든 변수, 각종 클래스 등을 사용하려면 메모리가 필요하겠지요...
스택메모리는 주로 콜 히스토리 등에 사용될 것이고...(으아... 정리하기 매우 힘듭니다... ;ㅅ;)
변수나 동적 할 당 메모리 등은 heap 에 올라가겠지요...
어디에서 어떤 내용을 보셨는지는 알 수 없으나 휴대폰 단말도 당연 이러한 메모리들이 있습니다.
각설하고 결론을 다시 정리하자면...
사이즈의 문제입니다. 더 정확하게는 이미지 한장 한장의 사이즈가 아닌 동시에 메모리상에 로드되는 이미지들의 토탈 사이즈가 문제라고 할 수 있겠네요.




말씀하신대로 메모리가 부족해서 죽은거입죠...
실제 JVM 이 사용 할 수 있는 heap memory 는 제법 여유가 있지만 BitmapFactory 가 이미지를 로드할 때 사용하는 native heap 의 경우 그닥 여유롭진 않습니다.
정확한 native heap 의 사이즈는 제조사에서 결정하고 있다고 알고 있습니다...
암튼 메우큰 이미지를 동시에 여러장 사용하시는게 아닌가 싶습니다.
각 이미지가 매우 다이나믹하게 확대/축소 되어야 하는 경우가 아니시라면 샘플링 이미지를 사용하시면 어떨까 싶습니다.
BitmapFactory.Options 에보시면 inSampleSize 라는 걸 지정할 수 있습니다.
꼭 커다란 이미지를 원본 그대로 사용하셔야 한다면...
차라리 프로그램 컨셉을 수정하시길 권해드립니당