0

제 애플리케이션에서는 레이아웃이 많이 사용되고 main.xml 파일에서 많은 것을 사용하고 있습니다. 이 xml을 contentview 어플리케이션으로 설정하면 충돌이 발생합니다. 그 전에 두 스플래시 화면이 있습니다. 그 spash 화면에서 나는> 200kb 크기의 두 이미지를 사용했습니다. 로그에서 일부 메모리 누수 문제가있을 수 있습니다.안드로이드 메모리 문제 - VM은 우리에게 2764800 바이트를 할당시키지 않을 것입니다.

09-06 03:26:14.749: E/GraphicsJNI(2212): VM won't let us allocate 2764800 bytes 
09-06 03:26:14.788: D/AndroidRuntime(2212): Shutting down VM 
09-06 03:26:14.788: W/dalvikvm(2212): threadid=1: thread exiting with uncaught exception (group=0x4001d7e0) 
09-06 03:26:14.788: I/EXCEPOTION(2212): Aise 
09-06 03:26:14.952: E/AndroidRuntime(2212): FATAL EXCEPTION: main 
09-06 03:26:14.952: E/AndroidRuntime(2212): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.jukte.forgivenessapplication/com.jukte.forgivenessapplication.Home}: android.view.InflateException: Binary XML file line #147: Error inflating class <unknown> 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.os.Handler.dispatchMessage(Handler.java:99) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.os.Looper.loop(Looper.java:123) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at java.lang.reflect.Method.invoke(Method.java:521) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at dalvik.system.NativeStart.main(Native Method) 
09-06 03:26:14.952: E/AndroidRuntime(2212): Caused by: android.view.InflateException: Binary XML file line #147: Error inflating class <unknown> 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.view.LayoutInflater.createView(LayoutInflater.java:513) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:618) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.view.LayoutInflater.inflate(LayoutInflater.java:407) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.view.LayoutInflater.inflate(LayoutInflater.java:320) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.view.LayoutInflater.inflate(LayoutInflater.java:276) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:198) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.app.Activity.setContentView(Activity.java:1647) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at com.jukte.forgivenessapplication.Home.onCreate(Home.java:142) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  ... 11 more 
09-06 03:26:14.952: E/AndroidRuntime(2212): Caused by: java.lang.reflect.InvocationTargetException 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.widget.ScrollView.<init>(ScrollView.java:133) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at java.lang.reflect.Constructor.constructNative(Native Method) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at java.lang.reflect.Constructor.newInstance(Constructor.java:446) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.view.LayoutInflater.createView(LayoutInflater.java:500) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  ... 22 more 
09-06 03:26:14.952: E/AndroidRuntime(2212): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.graphics.Bitmap.nativeCreate(Native Method) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.graphics.Bitmap.createBitmap(Bitmap.java:468) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.graphics.Bitmap.createBitmap(Bitmap.java:435) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:340) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:488) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:462) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:323) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.content.res.Resources.loadDrawable(Resources.java:1709) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.content.res.TypedArray.getDrawable(TypedArray.java:601) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.view.View.<init>(View.java:1885) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.view.ViewGroup.<init>(ViewGroup.java:291) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.widget.FrameLayout.<init>(FrameLayout.java:83) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  at android.widget.ScrollView.<init>(ScrollView.java:137) 
09-06 03:26:14.952: E/AndroidRuntime(2212):  ... 26 more 

내가 무엇이 잘못되었는지 파악하지 못할 ... 도움을 주셔서 감사합니다 ......

+0

모든 스플래시 화면 자산을 수동으로 삭제하고 가비지 수집기에 통지해야합니다. 하지만 코드를 보지 않고는 더 이상 알 수 없습니다. 당신이 사용하고있는 비트 맵의 ​​크기는 어쩌면 32 비트가 아닌 16 비트 또는 8 비트 PNG로 만들 수 있습니까? – WIllJBD

+1

실제로 16 비트 또는 8 비트로 변경해도 차이는 없습니다. 그것은 단지 파일 압축을위한 것입니다. 비트 맵으로 메모리에있는 한 비트 맵 구성과 비트 맵 크기 만 중요합니다. – mehmetminanc

+0

다른 화면 크기에 대해 서로 다른 크기의 이미지를 사용해야한다고 막 게시하려고했습니다. 일반적으로 큰 화면에는 큰 힙이 있습니다. 또한 힙 크기를 얻고 힙 크기에 따라로드 할 이미지의 버전을 직접 선택할 수 있습니다. – WIllJBD

답변

1

이미지의 파일 크기가 (>이 경우 2백킬로바이트가) 있습니다 여기 내 로그입니다 로드하는 데 필요한 VM의 양과 관련이 없습니다. 메모리의 양을 결정하는 가장 좋은 방법은 이미지의 높이와 너비에 알파 채널이 있는지 여부를 사전에 사용하는 것입니다.

크기가 400 x 800, 알파 채널 및 채널당 8 비트 (ARGB_8888) 인 이미지가있는 경우 VM에서 이미지를로드하려면 400 x 800 x 4 바이트가 필요합니다.

프로그래밍 방식으로 BitmapFactory.decodexxxx (xxxx, options)를 사용할 수 있습니다. 여기서 options는 디코딩 만하도록 설정 한 다음 이미지의 실제 너비와 높이를 읽습니다. 이미지가 너무 큰 경우 동일한 BitmapFactory 메서드를 사용하고 이미지의 크기를 조절하도록 옵션을 설정할 수 있습니다.

여기이로드 당신이 그것을 확장 할 같은 옵션을 사용할 수 있습니다, 이미지의 크기에 따라 다음

BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inJustDecodeBounds = true; 
     InputStream inputStream = context.getContentResolver() 
       .openInputStream(imageUri); 
     BitmapFactory.decodeStream(inputStream, null, options); 
     inputStream.close(); 
     int imageWidth = options.outWidth; 
     int imageHeight = options.outHeight; 

로 이미지를로드 InputStream를 사용하는 예제입니다 :

options.inJustDecodeBounds = false; 
     options.inSampleSize = sampleSize; 
     inputStream = context.getContentResolver() 
       .openInputStream(imageUri); 
     bitmap = BitmapFactory.decodeStream(inputStream, null, options); 
     inputStream.close(); 
+0

> 2MB가 넘으면 200KB는 비트 맵에 적합합니다. 내 관찰에 따르면 비트 맵의 ​​2MB조차도 고통스럽지 만 장치에로드 가능한 RAM은 약 512MB입니다. – mehmetminanc

+0

빠른 답장을 보내 주셔서 감사합니다. 나는 스플래시 화면에서 이미지를 디코딩하기 위해 http://developer.android.com/training/displaying-bitmaps/load-bitmap.html이 코드를 사용하고 있습니다. 그러나 여전히 오류가 있습니다. BTW 나는 스플래쉬의 다음 화면에서 매우 복잡한 레이아웃을했습니다. 그리고 스플래시 화면에서 오류가 발생하지 않는 이유는 홈 화면의 XML 파일을 부 풀리는 동안 오류가 발생하기 때문입니다. – rawcoder064

+0

안녕 모두들 내가 문제를 해결했습니다. 문제는 모든 이미지가 폭과 높이가 매우 컸다는 것입니다. 그래서 Google의 디코딩 코드를 사용하여 이미지를 디코딩하고 사용했습니다. – rawcoder064