8

So this app I am working on, works just fine on a really old miserable Android 2.3.3 phone. However when running it on the GS4, the GS4 is throwing out of memory exceptions every time is has to load a resource from the drawables, that is predefined in the xml.

<ImageView
        android:id="@+id/ivLearnMore"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:layout_weight="1"
        android:scaleType="fitCenter"
        android:src="@drawable/learn_more" />

For example this Imageview will throw an exception when inflating the layout because it already has an image assigned. (256x256)

what is going on?

05-08 10:33:54.972: E/dalvikvm-heap(24423): Out of memory on a 16777232-byte allocation.
05-08 10:33:54.972: I/dalvikvm(24423): "main" prio=5 tid=1 RUNNABLE
05-08 10:33:54.972: I/dalvikvm(24423):   | group="main" sCount=0 dsCount=0 obj=0x41187b38 self=0x40dd1b68
05-08 10:33:54.972: I/dalvikvm(24423):   | sysTid=24423 nice=0 sched=0/0 cgrp=apps handle=1074533852
05-08 10:33:54.972: I/dalvikvm(24423):   | state=R schedstat=( 0 0 0 ) utm=147 stm=1265 core=0
05-08 10:33:54.972: I/dalvikvm(24423):   at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
05-08 10:33:54.972: I/dalvikvm(24423):   at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:596)
05-08 10:33:54.972: I/dalvikvm(24423):   at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444)
05-08 10:33:54.972: I/dalvikvm(24423):   at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:817)
05-08 10:33:54.972: I/dalvikvm(24423):   at android.content.res.Resources.loadDrawable(Resources.java:2854)
05-08 10:33:54.972: I/dalvikvm(24423):   at android.content.res.TypedArray.getDrawable(TypedArray.java:602)
05-08 10:33:54.972: I/dalvikvm(24423):   at android.view.View.<init>(View.java:3460)
05-08 10:33:54.972: I/dalvikvm(24423):   at android.view.ViewGroup.<init>(ViewGroup.java:446)
05-08 10:33:54.972: I/dalvikvm(24423):   at android.widget.LinearLayout.<init>(LinearLayout.java:176)
05-08 10:33:54.972: I/dalvikvm(24423):   at android.widget.LinearLayout.<init>(LinearLayout.java:172)
05-08 10:33:54.972: I/dalvikvm(24423):   at java.lang.reflect.Constructor.constructNative(Native Method)
05-08 10:33:54.972: I/dalvikvm(24423):   at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
05-08 10:33:54.972: I/dalvikvm(24423):   at android.view.LayoutInflater.createView(LayoutInflater.java:593)
05-08 10:33:54.972: I/dalvikvm(24423):   at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
05-08 10:33:54.972: I/dalvikvm(24423):   at android.view.LayoutInflater.onCreateView(LayoutInflater.java:666)
05-08 10:33:54.972: I/dalvikvm(24423):   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:691)
05-08 10:33:54.972: I/dalvikvm(24423):   at android.view.LayoutInflater.inflate(LayoutInflater.java:467)
05-08 10:33:54.972: I/dalvikvm(24423):   at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
05-08 10:33:54.972: I/dalvikvm(24423):   at com.travelstorysgps.travelstorys.FragmentInfo.onCreateView(FragmentInfo.java:54)
05-08 10:33:54.972: I/dalvikvm(24423):   at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)
05-08 10:33:54.972: I/dalvikvm(24423):   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911)
05-08 10:33:54.972: I/dalvikvm(24423):   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
05-08 10:33:54.972: I/dalvikvm(24423):   at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
05-08 10:33:54.972: I/dalvikvm(24423):   at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
05-08 10:33:54.972: I/dalvikvm(24423):   at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429)
05-08 10:33:54.972: I/dalvikvm(24423):   at android.os.Handler.handleCallback(Handler.java:725)
05-08 10:33:54.972: I/dalvikvm(24423):   at android.os.Handler.dispatchMessage(Handler.java:92)
05-08 10:33:54.972: I/dalvikvm(24423):   at android.os.Looper.loop(Looper.java:137)
05-08 10:33:54.972: I/dalvikvm(24423):   at android.app.ActivityThread.main(ActivityThread.java:5293)
05-08 10:33:54.972: I/dalvikvm(24423):   at java.lang.reflect.Method.invokeNative(Native Method)
05-08 10:33:54.972: I/dalvikvm(24423):   at java.lang.reflect.Method.invoke(Method.java:511)
05-08 10:33:54.972: I/dalvikvm(24423):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
05-08 10:33:54.972: I/dalvikvm(24423):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
05-08 10:33:54.972: I/dalvikvm(24423):   at dalvik.system.NativeStart.main(Native Method)
05-08 10:33:54.972: D/skia(24423): --- decoder->decode returned false
05-08 10:33:54.972: D/AndroidRuntime(24423): Shutting down VM
05-08 10:33:54.972: W/dalvikvm(24423): threadid=1: thread exiting with uncaught exception (group=0x41186ac8)
05-08 10:33:54.992: E/AndroidRuntime(24423): FATAL EXCEPTION: main
05-08 10:33:54.992: E/AndroidRuntime(24423): android.view.InflateException: Binary XML file line #2: Error inflating class <unknown>
05-08 10:33:54.992: E/AndroidRuntime(24423):    at android.view.LayoutInflater.createView(LayoutInflater.java:619)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at android.view.LayoutInflater.onCreateView(LayoutInflater.java:666)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:691)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at android.view.LayoutInflater.inflate(LayoutInflater.java:467)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at com.travelstorysgps.travelstorys.FragmentInfo.onCreateView(FragmentInfo.java:54)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at android.os.Handler.handleCallback(Handler.java:725)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at android.os.Handler.dispatchMessage(Handler.java:92)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at android.os.Looper.loop(Looper.java:137)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at android.app.ActivityThread.main(ActivityThread.java:5293)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at java.lang.reflect.Method.invokeNative(Native Method)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at java.lang.reflect.Method.invoke(Method.java:511)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at dalvik.system.NativeStart.main(Native Method)
05-08 10:33:54.992: E/AndroidRuntime(24423): Caused by: java.lang.reflect.InvocationTargetException
05-08 10:33:54.992: E/AndroidRuntime(24423):    at java.lang.reflect.Constructor.constructNative(Native Method)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at android.view.LayoutInflater.createView(LayoutInflater.java:593)
05-08 10:33:54.992: E/AndroidRuntime(24423):    ... 21 more
05-08 10:33:54.992: E/AndroidRuntime(24423): Caused by: java.lang.OutOfMemoryError
05-08 10:33:54.992: E/AndroidRuntime(24423):    at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:596)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:817)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at android.content.res.Resources.loadDrawable(Resources.java:2854)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at android.content.res.TypedArray.getDrawable(TypedArray.java:602)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at android.view.View.<init>(View.java:3460)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at android.view.ViewGroup.<init>(ViewGroup.java:446)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at android.widget.LinearLayout.<init>(LinearLayout.java:176)
05-08 10:33:54.992: E/AndroidRuntime(24423):    at android.widget.LinearLayout.<init>(LinearLayout.java:172)
05-08 10:33:54.992: E/AndroidRuntime(24423):    ... 24 more

Here is a exception from a different screen

05-08 10:35:29.565: E/dalvikvm-heap(24774): Out of memory on a 16777232-byte allocation.
05-08 10:35:29.565: I/dalvikvm(24774): "main" prio=5 tid=1 RUNNABLE
05-08 10:35:29.565: I/dalvikvm(24774):   | group="main" sCount=0 dsCount=0 obj=0x41187b38 self=0x40dd1b68
05-08 10:35:29.565: I/dalvikvm(24774):   | sysTid=24774 nice=0 sched=0/0 cgrp=apps handle=1074533852
05-08 10:35:29.565: I/dalvikvm(24774):   | state=R schedstat=( 0 0 0 ) utm=175 stm=2086 core=1
05-08 10:35:29.565: I/dalvikvm(24774):   at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
05-08 10:35:29.565: I/dalvikvm(24774):   at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:596)
05-08 10:35:29.565: I/dalvikvm(24774):   at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444)
05-08 10:35:29.565: I/dalvikvm(24774):   at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:817)
05-08 10:35:29.565: I/dalvikvm(24774):   at android.content.res.Resources.loadDrawable(Resources.java:2854)
05-08 10:35:29.565: I/dalvikvm(24774):   at android.content.res.TypedArray.getDrawable(TypedArray.java:602)
05-08 10:35:29.565: I/dalvikvm(24774):   at android.view.View.<init>(View.java:3460)
05-08 10:35:29.565: I/dalvikvm(24774):   at android.view.ViewGroup.<init>(ViewGroup.java:446)
05-08 10:35:29.565: I/dalvikvm(24774):   at android.widget.LinearLayout.<init>(LinearLayout.java:176)
05-08 10:35:29.565: I/dalvikvm(24774):   at android.widget.LinearLayout.<init>(LinearLayout.java:172)
05-08 10:35:29.565: I/dalvikvm(24774):   at java.lang.reflect.Constructor.constructNative(Native Method)
05-08 10:35:29.565: I/dalvikvm(24774):   at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
05-08 10:35:29.565: I/dalvikvm(24774):   at android.view.LayoutInflater.createView(LayoutInflater.java:593)
05-08 10:35:29.565: I/dalvikvm(24774):   at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
05-08 10:35:29.565: I/dalvikvm(24774):   at android.view.LayoutInflater.onCreateView(LayoutInflater.java:666)
05-08 10:35:29.565: I/dalvikvm(24774):   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:691)
05-08 10:35:29.565: I/dalvikvm(24774):   at android.view.LayoutInflater.inflate(LayoutInflater.java:467)
05-08 10:35:29.565: I/dalvikvm(24774):   at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
05-08 10:35:29.565: I/dalvikvm(24774):   at com.travelstorysgps.travelstorys.FragmentDonate.onCreateView(FragmentDonate.java:53)
05-08 10:35:29.565: I/dalvikvm(24774):   at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)
05-08 10:35:29.565: I/dalvikvm(24774):   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911)
05-08 10:35:29.565: I/dalvikvm(24774):   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
05-08 10:35:29.565: I/dalvikvm(24774):   at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
05-08 10:35:29.565: I/dalvikvm(24774):   at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
05-08 10:35:29.565: I/dalvikvm(24774):   at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429)
05-08 10:35:29.565: I/dalvikvm(24774):   at android.os.Handler.handleCallback(Handler.java:725)
05-08 10:35:29.565: I/dalvikvm(24774):   at android.os.Handler.dispatchMessage(Handler.java:92)
05-08 10:35:29.565: I/dalvikvm(24774):   at android.os.Looper.loop(Looper.java:137)
05-08 10:35:29.565: I/dalvikvm(24774):   at android.app.ActivityThread.main(ActivityThread.java:5293)
05-08 10:35:29.565: I/dalvikvm(24774):   at java.lang.reflect.Method.invokeNative(Native Method)
05-08 10:35:29.565: I/dalvikvm(24774):   at java.lang.reflect.Method.invoke(Method.java:511)
05-08 10:35:29.565: I/dalvikvm(24774):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
05-08 10:35:29.565: I/dalvikvm(24774):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
05-08 10:35:29.565: I/dalvikvm(24774):   at dalvik.system.NativeStart.main(Native Method)
05-08 10:35:29.565: D/AbsListView(24774): [unregisterDoubleTapMotionListener]
05-08 10:35:29.565: I/MotionRecognitionManager(24774):   .unregisterListener : / listener count = 0->0,  
05-08 10:35:29.565: D/skia(24774): --- decoder->decode returned false
05-08 10:35:29.565: D/AbsListView(24774): unregisterIRListener() is called 
05-08 10:35:29.565: D/AndroidRuntime(24774): Shutting down VM
05-08 10:35:29.565: W/dalvikvm(24774): threadid=1: thread exiting with uncaught exception (group=0x41186ac8)
05-08 10:35:29.595: E/AndroidRuntime(24774): FATAL EXCEPTION: main
05-08 10:35:29.595: E/AndroidRuntime(24774): android.view.InflateException: Binary XML file line #2: Error inflating class <unknown>
05-08 10:35:29.595: E/AndroidRuntime(24774):    at android.view.LayoutInflater.createView(LayoutInflater.java:619)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at android.view.LayoutInflater.onCreateView(LayoutInflater.java:666)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:691)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at android.view.LayoutInflater.inflate(LayoutInflater.java:467)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at com.travelstorysgps.travelstorys.FragmentDonate.onCreateView(FragmentDonate.java:53)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at android.os.Handler.handleCallback(Handler.java:725)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at android.os.Handler.dispatchMessage(Handler.java:92)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at android.os.Looper.loop(Looper.java:137)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at android.app.ActivityThread.main(ActivityThread.java:5293)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at java.lang.reflect.Method.invokeNative(Native Method)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at java.lang.reflect.Method.invoke(Method.java:511)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at dalvik.system.NativeStart.main(Native Method)
05-08 10:35:29.595: E/AndroidRuntime(24774): Caused by: java.lang.reflect.InvocationTargetException
05-08 10:35:29.595: E/AndroidRuntime(24774):    at java.lang.reflect.Constructor.constructNative(Native Method)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at android.view.LayoutInflater.createView(LayoutInflater.java:593)
05-08 10:35:29.595: E/AndroidRuntime(24774):    ... 21 more
05-08 10:35:29.595: E/AndroidRuntime(24774): Caused by: java.lang.OutOfMemoryError
05-08 10:35:29.595: E/AndroidRuntime(24774):    at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:596)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:817)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at android.content.res.Resources.loadDrawable(Resources.java:2854)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at android.content.res.TypedArray.getDrawable(TypedArray.java:602)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at android.view.View.<init>(View.java:3460)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at android.view.ViewGroup.<init>(ViewGroup.java:446)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at android.widget.LinearLayout.<init>(LinearLayout.java:176)
05-08 10:35:29.595: E/AndroidRuntime(24774):    at android.widget.LinearLayout.<init>(LinearLayout.java:172)
05-08 10:35:29.595: E/AndroidRuntime(24774):    ... 24 more

and here is a 3rd and different screen

05-08 10:37:20.113: E/dalvikvm-heap(25740): Out of memory on a 16777232-byte allocation.
05-08 10:37:20.123: I/dalvikvm(25740): "main" prio=5 tid=1 RUNNABLE
05-08 10:37:20.123: I/dalvikvm(25740):   | group="main" sCount=0 dsCount=0 obj=0x41187b38 self=0x40dd1b68
05-08 10:37:20.123: I/dalvikvm(25740):   | sysTid=25740 nice=0 sched=0/0 cgrp=apps handle=1074533852
05-08 10:37:20.123: I/dalvikvm(25740):   | state=R schedstat=( 0 0 0 ) utm=156 stm=1070 core=1
05-08 10:37:20.123: I/dalvikvm(25740):   at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
05-08 10:37:20.123: I/dalvikvm(25740):   at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:596)
05-08 10:37:20.123: I/dalvikvm(25740):   at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444)
05-08 10:37:20.123: I/dalvikvm(25740):   at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:817)
05-08 10:37:20.123: I/dalvikvm(25740):   at android.content.res.Resources.loadDrawable(Resources.java:2854)
05-08 10:37:20.123: I/dalvikvm(25740):   at android.content.res.TypedArray.getDrawable(TypedArray.java:602)
05-08 10:37:20.123: I/dalvikvm(25740):   at android.view.View.<init>(View.java:3460)
05-08 10:37:20.123: I/dalvikvm(25740):   at android.view.ViewGroup.<init>(ViewGroup.java:446)
05-08 10:37:20.123: I/dalvikvm(25740):   at android.widget.LinearLayout.<init>(LinearLayout.java:176)
05-08 10:37:20.123: I/dalvikvm(25740):   at android.widget.LinearLayout.<init>(LinearLayout.java:172)
05-08 10:37:20.123: I/dalvikvm(25740):   at java.lang.reflect.Constructor.constructNative(Native Method)
05-08 10:37:20.123: I/dalvikvm(25740):   at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
05-08 10:37:20.123: I/dalvikvm(25740):   at android.view.LayoutInflater.createView(LayoutInflater.java:593)
05-08 10:37:20.123: I/dalvikvm(25740):   at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
05-08 10:37:20.123: I/dalvikvm(25740):   at android.view.LayoutInflater.onCreateView(LayoutInflater.java:666)
05-08 10:37:20.123: I/dalvikvm(25740):   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:691)
05-08 10:37:20.123: I/dalvikvm(25740):   at android.view.LayoutInflater.inflate(LayoutInflater.java:467)
05-08 10:37:20.123: I/dalvikvm(25740):   at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
05-08 10:37:20.123: I/dalvikvm(25740):   at com.travelstorysgps.travelstorys.FragmentConnect.onCreateView(FragmentConnect.java:73)
05-08 10:37:20.123: I/dalvikvm(25740):   at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)
05-08 10:37:20.123: I/dalvikvm(25740):   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911)
05-08 10:37:20.123: I/dalvikvm(25740):   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
05-08 10:37:20.123: I/dalvikvm(25740):   at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
05-08 10:37:20.123: I/dalvikvm(25740):   at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
05-08 10:37:20.123: I/dalvikvm(25740):   at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429)
05-08 10:37:20.123: I/dalvikvm(25740):   at android.os.Handler.handleCallback(Handler.java:725)
05-08 10:37:20.123: I/dalvikvm(25740):   at android.os.Handler.dispatchMessage(Handler.java:92)
05-08 10:37:20.123: I/dalvikvm(25740):   at android.os.Looper.loop(Looper.java:137)
05-08 10:37:20.123: I/dalvikvm(25740):   at android.app.ActivityThread.main(ActivityThread.java:5293)
05-08 10:37:20.123: I/dalvikvm(25740):   at java.lang.reflect.Method.invokeNative(Native Method)
05-08 10:37:20.123: I/dalvikvm(25740):   at java.lang.reflect.Method.invoke(Method.java:511)
05-08 10:37:20.123: I/dalvikvm(25740):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
05-08 10:37:20.123: I/dalvikvm(25740):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
05-08 10:37:20.123: I/dalvikvm(25740):   at dalvik.system.NativeStart.main(Native Method)
05-08 10:37:20.123: D/skia(25740): --- decoder->decode returned false
05-08 10:37:20.123: D/AndroidRuntime(25740): Shutting down VM
05-08 10:37:20.123: W/dalvikvm(25740): threadid=1: thread exiting with uncaught exception (group=0x41186ac8)
05-08 10:37:20.133: E/AndroidRuntime(25740): FATAL EXCEPTION: main
05-08 10:37:20.133: E/AndroidRuntime(25740): android.view.InflateException: Binary XML file line #2: Error inflating class <unknown>
05-08 10:37:20.133: E/AndroidRuntime(25740):    at android.view.LayoutInflater.createView(LayoutInflater.java:619)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at android.view.LayoutInflater.onCreateView(LayoutInflater.java:666)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:691)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at android.view.LayoutInflater.inflate(LayoutInflater.java:467)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at com.travelstorysgps.travelstorys.FragmentConnect.onCreateView(FragmentConnect.java:73)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at android.os.Handler.handleCallback(Handler.java:725)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at android.os.Handler.dispatchMessage(Handler.java:92)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at android.os.Looper.loop(Looper.java:137)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at android.app.ActivityThread.main(ActivityThread.java:5293)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at java.lang.reflect.Method.invokeNative(Native Method)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at java.lang.reflect.Method.invoke(Method.java:511)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at dalvik.system.NativeStart.main(Native Method)
05-08 10:37:20.133: E/AndroidRuntime(25740): Caused by: java.lang.reflect.InvocationTargetException
05-08 10:37:20.133: E/AndroidRuntime(25740):    at java.lang.reflect.Constructor.constructNative(Native Method)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at android.view.LayoutInflater.createView(LayoutInflater.java:593)
05-08 10:37:20.133: E/AndroidRuntime(25740):    ... 21 more
05-08 10:37:20.133: E/AndroidRuntime(25740): Caused by: java.lang.OutOfMemoryError
05-08 10:37:20.133: E/AndroidRuntime(25740):    at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:596)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:817)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at android.content.res.Resources.loadDrawable(Resources.java:2854)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at android.content.res.TypedArray.getDrawable(TypedArray.java:602)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at android.view.View.<init>(View.java:3460)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at android.view.ViewGroup.<init>(ViewGroup.java:446)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at android.widget.LinearLayout.<init>(LinearLayout.java:176)
05-08 10:37:20.133: E/AndroidRuntime(25740):    at android.widget.LinearLayout.<init>(LinearLayout.java:172)
05-08 10:37:20.133: E/AndroidRuntime(25740):    ... 24 more
WIllJBD
  • 6,144
  • 3
  • 34
  • 44

3 Answers3

16

(@Arash's answer provides a workaround, but this is my attempt to explain why it may work.)

So you have a rather big image in the drawable resource directory, you reference it in your layout xml file, and get an out of memory error at runtime when inflating it.

When loading drawable resources, Android will perform some pre-scaling if it deems it necessary. From the official documentation:

Based on the density of the current screen, the system uses any size- or density-specific resources from your application and displays them without scaling. If resources are not available in the correct density, the system loads the default resources and scales them up or down as needed to match the current screen's density. The system assumes that default resources (those from a directory without configuration qualifiers) are designed for the baseline screen density (mdpi), unless they are loaded from a density-specific resource directory.

This means 2 things:

  1. If there's no resource of the density of the environment the application is currently running on, the system will take a resource of another density and scale it (up or down) to match the target density
  2. Resources put in the drawable directory are assumed to be targeting an mdpi density

So you're currently running on an xxhdpi phone. The system wants to load the learn_more drawable resource to paint it on the ivLearnMore widget. It will look for it in the drawable-xxhdpi in priority but won't find it there, so will take the closest one it finds, in this case the one in the drawable directory (which it assumes to be targeting mdpi density), and load it into memory scaling it by a factor of 3 which is a lot if your image file was significantly big and can easily require more memory than is available to the application (and cause an out of memory error).

This is also why it loaded fine on your old crappy 2.3 device: the device was most likely of mdpi or hdpi density and the system didn't try to upscale it or did it by a factor of only 1.5.

The main thing here being that you put a resource suitable for an xxhdpi (or more ?) density in an mdpi directory.

So you have several options:

  1. provide one resource appropriately sized per density (i.e. one in each drawable-* directory): this is the best to avoid any problem, when possible
  2. if you only have one version of the resource, put it in the directory matching its density (drawable being equivalent to drawable-mdpi!), in your case maybe drawable-xxhdpi (depends on your resource)
  3. put the resource in the drawable-nodpi directory, this will prevent the system from performing any pre-scaling of the resource (but this is typically for density-agnostic resources e.g. which you resize yourself at runtime)
Community
  • 1
  • 1
desseim
  • 7,968
  • 2
  • 24
  • 26
7

I had the same problem and that was : Galaxy S4 and all 1920*1080 resolution devices , check in xxhdpi folder first and if there is not specific images,it will scale other sizes like xhdpi,... so i moved my pictures to xxhdpi folder and it Solved!

Arash
  • 3,013
  • 10
  • 52
  • 74
6

I have discovered the problem. Background images are apparently not handled very efficiently, especially not for a 1920x1080 screen. Therefor you should use a custom xml drawable, a flat color, or a 24-bit jpg. Funny enough I just ran some tests and a 1920x1080 jpeg takes up 95.60 KB while the same image rendered as a png takes up 929.09 KB.

So I did some testing and found that xml defined drawables with gradients etc. are super fast, I then tried my 1920x1080 jpg and it was super fast, so then I put in a 1920x1080 png and got the error. This is funny to me because the png I has set at the start for HD screens was only 910x540 and I would get the error.

So lesson here is if you want a image background use a jpg.

WIllJBD
  • 6,144
  • 3
  • 34
  • 44
  • I'm wondering, why small picture files (like 910x540 png) can cause an memory overflow of the VM heap size. My customers are expierencing the same issue with their S4s and other FullHD-Devices.Even if I use android:largeHeap="true" in the Manifest. First I tried to get the Heap Memory: TextView infotxt_ram = (TextView)findViewById(R.id.infotxt_ram); ActivityManager am = (ActivityManager)this.getSystemService(ACTIVITY_SERVICE); infotxt_ram.setText(am.getMemoryClass() + "MB"); This displays 128MB! – lx222 Oct 12 '13 at 12:04
  • Let's do a little Math. 910x540x32bit (with alpha channel) = 1,87 MB. Mathematically I should been able to display 68 Images of that size!?! Ok the process itself also eats up a big amount of that size but some small images of e.g 910x540px shouldn't give us an OutOfMemorry error. I'm right, am I not? – lx222 Oct 12 '13 at 12:17
  • I'm using JPEG compression algorithm and bitmap caches... my Galaxy S4 crashes but my Nexus 5 does not! Nexus 5 has nearly identical hardware and memory. But one thing I noticed is that getMemoryClass gives S4 128m and N5 192m , so that is a substantial difference but my Nexus S also does not crash and it gets 48m only! – CQM Mar 18 '14 at 21:41
  • 2
    Not sure why do you think jpg and png are handled different since you always end up with bitmap calculation (4 x width x height). 4 is for RGBA pixel byte size. – vbokan Jul 28 '14 at 14:38
  • @vbokan is right. The difference in PNG vs JPEG is a difference in _file size_. In order for those files to be useful as images, they have to be decompressed, so their size _in memory_ will always be `width * height * 4`, regardless of whether that data was initially compressed with PNG or JPEG. – Steve Blackwell Apr 11 '15 at 18:41
  • And yet, regardless, when jpg is used there was no crash, and when png was used there was a crash. When jpg is used android runs noticeably faster, and with png noticeably slower. So somewhere in there, something is happening, that is not being explained, and there is indeed a very obvious and real difference, even if you can't explain it. – WIllJBD Apr 11 '15 at 20:25