0

지난 3 일 동안이 "메모리 누출"에 대해 계속적으로 대처 해 왔으며 응용 프로그램의 다른 부분을 간소화하면서이 문제가 남아 있습니다.Android OOM 이미지 캡쳐가있는 비트 맵

먼저 무엇을하려고합니다. 이미지를 파일에 저장하려면 EXTRA_OUTPUT을 사용하여 IMAGE_CAPTURE의 인 텐트를 실행하고 있습니다. 그런 다음 반환 된 이미지를 사용자에게 2의 배수로 축소하여 표시하여 이미지의 정사각형 부분을 선택하게합니다. 일단 그가 그것을 선택하면, 그는 다른 텍스트로 텍스트에 태그를 붙이며 결국 HTTPPost를 사용하여 모든 것을 서버에 업로드 할 수있는 다른 활동으로 이동합니다.

지금은 모든 것이 정확히 정확하게 작동합니다! 나는 그것을 통과하고 아무 문제없이 모든 것이 작동합니다. 그러나 다른 사진을 찍으려고하면 항상 메모리 부족 예외가 발생합니다. 여기에 로그 캣은 사용자에게 한 번 사진을 표시 같이 그것은 마지막 활동의 된 setContentView에 실패

02-18 19:07:19.498: ERROR/dalvikvm-heap(6385): 1040400-byte external allocation too large for this process. 
02-18 19:07:19.498: ERROR/GraphicsJNI(6385): VM won't let us allocate 1040400 bytes 
02-18 19:07:19.498: DEBUG/AndroidRuntime(6385): Shutting down VM 
02-18 19:07:19.498: WARN/dalvikvm(6385): threadid=1: thread exiting with uncaught exception (group=0x4001d7f0) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): FATAL EXCEPTION: main 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.hitpost/com.hitpost.SharePicture}: android.view.InflateException: Binary XML file line #29: Error inflating class <unknown> 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at android.os.Handler.dispatchMessage(Handler.java:99) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at android.os.Looper.loop(Looper.java:123) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at java.lang.reflect.Method.invoke(Method.java:521) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at dalvik.system.NativeStart.main(Native Method) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): Caused by: android.view.InflateException: Binary XML file line #29: Error inflating class <unknown> 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at android.view.LayoutInflater.createView(LayoutInflater.java:513) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:618) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:621) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at android.view.LayoutInflater.inflate(LayoutInflater.java:407) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at android.view.LayoutInflater.inflate(LayoutInflater.java:320) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at android.view.LayoutInflater.inflate(LayoutInflater.java:276) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:198) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at android.app.Activity.setContentView(Activity.java:1647) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at com.hitpost.SharePicture.onCreate(SharePicture.java:90) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  ... 11 more 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): Caused by: java.lang.reflect.InvocationTargetException 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at android.widget.ImageView.<init>(ImageView.java:108) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at java.lang.reflect.Constructor.constructNative(Native Method) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at java.lang.reflect.Constructor.newInstance(Constructor.java:446) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at android.view.LayoutInflater.createView(LayoutInflater.java:500) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  ... 23 more 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at android.graphics.Bitmap.nativeCreate(Native Method) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at android.graphics.Bitmap.createBitmap(Bitmap.java:468) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at android.graphics.Bitmap.createBitmap(Bitmap.java:435) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:340) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:488) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:462) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:323) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at android.content.res.Resources.loadDrawable(Resources.java:1709) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at android.content.res.TypedArray.getDrawable(TypedArray.java:601) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  at android.widget.ImageView.<init>(ImageView.java:118) 
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):  ... 27 more 

일이야 최신 시간이지만, 어떻게 든 다시 표시 할 수 없습니다.

정말 도움을 주시면 감사하겠습니다.

업데이트 됨 이 문제는 여러 대의 휴대 전화에서 테스트되었으며, 그 중 하나가 Froyo가있는 Nexus One입니다. Samsung Captivate 2.1에서 작동하며 Moto Milestone 2.1에서이 문제와 관련하여 충돌하지 않습니다.

또한 나는 내가 배 이상으로 축소 할 수 끝에 500 X 500 이미지가 필요 2.

+0

이미지를 더 아래로 축소하려는 경우가 있습니다. 이미지의 가로 세로 비율과 원본 크기의 함수로 비율 비율을 계산하십시오. – Samuh

+0

Samuh, 서버에 업로드하는 데 500x500 이미지가 필요하기 때문에 고맙겠습니다. 자세한 설명으로 설명을 업데이트하겠습니다. – Leo

답변

2

내 응답은 BitmapFactory OOM driving me nuts입니다.

비트 맵 데이터가 VM 힙이 아닌 기본 힙에 있습니다. 따라서 명시적인 VM 가비지 콜렉션은 효과가 없습니다.

원시 힙은 가비지 수집되지만 덜/적극적으로 수집됩니다. 우리가 일을 발견하는 유일한 방법은

  • 가 (당신이 그들을 필요로하지 않을 때 당신은
  • 까지 무료로 비트 맵을 OOM 예외를 때리지 마세요 확인 (위의 링크에 따라) 네이티브 힙 모니터입니다 (당신이하고있는 것처럼) 수행함으로써 (네이티브 힙의 공간을 되 찾을 것입니다)

    mBitmap.recycle(); mBitmap = null;

0

이 재생됩니다 있도록하는 SoftReference 객체에 비트 맵 객체를 포장하려고한다 메모리가 부족하고 앱이 현재 활동에서 이미지를 사용하지 않을 때 OS에 의해 또한 액티비티가 바뀔 때 이미지가 차지하는 메모리를 포기하는 것에 대해 생각해야하며, 특정 이미지로 액티비티가 재개 될 때 파일에서 이미지를 다시로드해야합니다.

+0

하칸, 아이디어를 주셔서 감사합니다. 그러나 이미이 활동에서 사용하고있는 비트 맵을 모두 재활용하고 null로 설정하고 있습니다. 그리고 언제든지 System.gc()를 호출하십시오. – Leo

관련 문제