Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget

In my application when I try to launch it Force Closed and the error pointing the line "setContentView(R.layout.Menu);" of the layout. And in the XML file it show the "OutOfMemoryError" image view in my layout. I am realy confused. Please guide me for further move.

Edited:

My application uses database, and at the very first time it parse some XML data and insert into the Sqlite database. My Outofmemory problem occurs only at the first time. Second time it works fine. I tried System.gc(). Is there any prob on that.

This is my Log:

E/dalvikvm-heap(2712): 105376-byte external allocation too large for this process. VM won't let us allocate 105376 bytes      FATAL EXCEPTION: main     java.lang.RuntimeException: Unable to start activity ComponentInfo{com.Test/com.Test.Menu}: android.view.InflateException: Binary XML file line #13: Error inflating class <unknown>     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)     at android.app.ActivityThread.access$1500(ActivityThread.java:117)     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)     at android.os.Handler.dispatchMessage(Handler.java:99)     at android.os.Looper.loop(Looper.java:130)     at android.app.ActivityThread.main(ActivityThread.java:3683)     at java.lang.reflect.Method.invokeNative(Native Method)     at java.lang.reflect.Method.invoke(Method.java:507)     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)     at dalvik.system.NativeStart.main(Native Method) Caused by: android.view.InflateException: Binary XML file line #13: Error inflating class <unknown>     at android.view.LayoutInflater.createView(LayoutInflater.java:518)     at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:568)     at android.view.LayoutInflater.rInflate(LayoutInflater.java:623)     at android.view.LayoutInflater.rInflate(LayoutInflater.java:626)     at android.view.LayoutInflater.inflate(LayoutInflater.java:408)     at android.view.LayoutInflater.inflate(LayoutInflater.java:320)     at android.view.LayoutInflater.inflate(LayoutInflater.java:276)     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:207)     at android.app.Activity.setContentView(Activity.java:1657)     at com.Test.Menu.onCreate(Menu.java:32)     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)     ... 11 more Caused by: java.lang.reflect.InvocationTargetException     at java.lang.reflect.Constructor.constructNative(Native Method)     at java.lang.reflect.Constructor.newInstance(Constructor.java:415)     at android.view.LayoutInflater.createView(LayoutInflater.java:505)     ... 23 more Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget     at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:460)     at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:336)     at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)     at android.content.res.Resources.loadDrawable(Resources.java:1709)     at android.content.res.TypedArray.getDrawable(TypedArray.java:601)     at android.widget.ImageView.<init>(ImageView.java:118)     at android.widget.ImageView.<init>(ImageView.java:108) 

This is my XML code:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">  <RelativeLayout     android:id="@+id/RL_Title"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:layout_weight="8"     android:onClick="onTitleClick" >      <ImageView         android:id="@+id/Img_Title_bg"         android:layout_width="match_parent"         android:layout_height="match_parent"         android:scaleType="center"         android:src="@drawable/title_bg" />      <Button         android:id="@+id/Btn_Title"         android:layout_width="match_parent"         android:layout_height="wrap_content"         android:layout_centerVertical="true"         android:layout_marginRight="5dp"         android:background="@drawable/title_al"         android:drawableRight="@drawable/pro"         android:gravity="center"         android:onClick="onTitleClick" /> </RelativeLayout>  <RelativeLayout     android:id="@+id/RL_MainMenu"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:layout_weight="1" android:onClick="onDoNothing">      <ImageView         android:id="@+id/ImageView01"         android:layout_width="match_parent"         android:layout_height="match_parent"         android:layout_weight="4"         android:src="@drawable/main_bg" android:scaleType="centerCrop"/>      <ImageView         android:id="@+id/Img_logo"         android:layout_width="match_parent"         android:layout_height="match_parent"         android:layout_weight="4"         android:scaleType="center"         android:src="@drawable/logo_al" />      <LinearLayout         android:id="@+id/LI_Menu"         android:layout_width="match_parent"         android:layout_height="wrap_content"         android:layout_above="@+id/RL_ExtraOption"         android:layout_alignTop="@+id/Img_logo"         android:layout_margin="2dp"         android:orientation="vertical" >          <ImageButton             android:id="@+id/Img_Buyer"             android:layout_width="match_parent"             android:layout_height="match_parent"             android:layout_margin="1dp"             android:layout_weight="1"             android:background="@drawable/bt_blink"             android:onClick="Nextclick"             android:scaleType="fitCenter"             android:soundEffectsEnabled="true"             android:src="@drawable/buyer_icon" />          <ImageButton             android:id="@+id/Img_Seller"             android:layout_width="match_parent"             android:layout_height="match_parent"             android:layout_margin="1dp"             android:layout_weight="1"             android:background="@drawable/bt_blink"             android:onClick="Nextclick"             android:scaleType="fitCenter"             android:src="@drawable/seller_icon" />          <ImageButton             android:id="@+id/Img_Lender"             android:layout_width="match_parent"             android:layout_height="match_parent"             android:layout_margin="1dp"             android:layout_weight="1"             android:background="@drawable/bt_blink"             android:onClick="Nextclick"             android:scaleType="fitCenter"             android:src="@drawable/lender_icon" />          <ImageButton             android:id="@+id/Img_myTitleRep"             android:layout_width="match_parent"             android:layout_height="match_parent"             android:layout_margin="1dp"             android:layout_weight="1"             android:background="@drawable/bt_blink"             android:onClick="Nextclick"             android:scaleType="fitCenter"             android:src="@drawable/my_title_rep_icon_al" />          <ImageButton             android:id="@+id/Img_Setup"             android:layout_width="match_parent"             android:layout_height="match_parent"             android:layout_margin="1dp"             android:layout_weight="1"             android:background="@drawable/bt_blink"             android:onClick="Nextclick"             android:scaleType="fitCenter"             android:src="@drawable/setup_icon" />     </LinearLayout>      <RelativeLayout         android:id="@+id/RL_ExtraOption"         android:layout_width="match_parent"         android:layout_height="wrap_content"         android:layout_alignParentBottom="true"         android:background="@drawable/main_bottom_bg" >          <TextView             android:id="@+id/txt_RepName"             android:layout_width="wrap_content"             android:layout_height="wrap_content"             android:layout_centerVertical="true"             android:layout_marginLeft="10dp"             android:textColor="@color/white"             android:textSize="@dimen/font_size" />          <TableRow             android:id="@+id/TR_ContactRep"             android:layout_width="wrap_content"             android:layout_height="wrap_content"             android:layout_alignParentRight="true"             android:layout_centerVertical="true"             android:gravity="center" >              <Button                 android:id="@+id/Btn_ContactRep"                 android:layout_width="wrap_content"                 android:layout_height="wrap_content"                 android:layout_marginRight="3dp"                 android:background="@drawable/contact_rep_blink"                 android:onClick="ContactRep_Click" />              <Button                 android:id="@+id/Btn_MoreOption"                 android:layout_width="wrap_content"                 android:layout_height="wrap_content"                 android:layout_marginRight="5dp"                 android:background="@drawable/main_more_blink"                 android:onClick="onMoreClick" />         </TableRow>     </RelativeLayout>      <LinearLayout         android:id="@+id/ln_Mainmore"         android:layout_width="match_parent"         android:layout_height="wrap_content"         android:background="@drawable/dialog_bg" android:layout_alignParentBottom="true" android:visibility="gone">          <LinearLayout             android:id="@+id/LinearLayout02"             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:layout_weight="3"             android:orientation="vertical" >         </LinearLayout>          <TableLayout             android:id="@+id/TableLayout01"             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:layout_weight="1"             android:gravity="center" >              <TableRow                 android:id="@+id/TableRow04"                 android:layout_width="match_parent"                 android:layout_height="match_parent"                 android:layout_margin="5dp"                 android:layout_marginTop="20dp"                 android:gravity="center" >                  <Button                     android:id="@+id/Btn_Rate"                     android:layout_width="match_parent"                     android:layout_height="match_parent"                     android:layout_weight="1"                     android:background="@drawable/property_blue_blink"                     android:onClick="onRate"                     android:singleLine="true"                     android:text="Rate/Testimonial"                     android:textColor="@color/white"                     android:textSize="@dimen/font_size"                     android:textStyle="bold" />             </TableRow>              <TableRow                 android:id="@+id/TableRow01"                 android:layout_width="match_parent"                 android:layout_height="match_parent"                 android:layout_margin="5dp"                 android:gravity="center" >                  <Button                     android:id="@+id/btn_SubFeature"                     android:layout_width="match_parent"                     android:layout_height="match_parent"                     android:layout_weight="1"                     android:background="@drawable/property_blue_blink"                     android:onClick="onSubFeature"                     android:singleLine="true"                     android:text="Submit A Feature"                     android:textColor="@color/white"                     android:textSize="@dimen/font_size"                     android:textStyle="bold" />             </TableRow>              <TableRow                 android:id="@+id/TableRow03"                 android:layout_width="match_parent"                 android:layout_height="match_parent"                 android:layout_margin="5dp"                 android:gravity="center" >                  <Button                     android:id="@+id/Btn_ReferFrnd"                     android:layout_width="match_parent"                     android:layout_height="match_parent"                     android:layout_weight="1"                     android:background="@drawable/property_blue_blink"                     android:onClick="onReferAFrnd"                     android:text="Refer A Friend"                     android:textColor="@color/white"                     android:textSize="@dimen/font_size"                     android:textStyle="bold" />             </TableRow>              <TableRow                 android:id="@+id/TableRow02"                 android:layout_width="match_parent"                 android:layout_height="match_parent"                 android:layout_margin="5dp"                 android:gravity="center" >                  <Button                     android:id="@+id/Btn_cancel"                     android:layout_width="match_parent"                     android:layout_height="match_parent"                     android:layout_weight="1"                     android:background="@drawable/property_cancel_blink"                     android:onClick="onClose"                     android:text="Cancel"                     android:textColor="@color/black"                     android:textSize="@dimen/font_size"                     android:textStyle="bold" />             </TableRow>         </TableLayout>          <LinearLayout             android:id="@+id/linearLayout2"             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:layout_weight="3"             android:orientation="vertical" >         </LinearLayout>     </LinearLayout>  </RelativeLayout> 

like image 465
Sniper Avatar asked Apr 25 '12 11:04

Sniper


2 Answers

I guess the problem is not in your layout; the problem is somewhere else in your code. And you are probably leaking context somewhere.

Other probable reason is that you must be creating bulky multiple objects while parsing your XML (as you mentioned this occurs the first time when you parse XML). Though Java has auto garbage collection approach, but still you can not completely rely on it. It is a good practice to nullify your collection instance or clear your objects content when you don't need them any more.

But still I have prepared a list of important points which you should remember while dealing with bitmaps on Android.

1) You can call recycle on each bitmap and set them to null. (bitmap.recycle() will release all the memory used by this bitmap, but it does not nullify the bitmap object).

2) You can also unbind the drawables associated with layouts when an activity is destroyed. Try the code given below and also have a look at this link link.

    private void unbindDrawables(View view) {         if (view.getBackground() != null) {             view.getBackground().setCallback(null);         }         if (view instanceof ViewGroup) {             for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {                 unbindDrawables(((ViewGroup) view).getChildAt(i));             }             ((ViewGroup) view).removeAllViews();         }     }  // Call this method from onDestroy()      void onDestroy() {         super.onDestroy();         unbindDrawables(findViewById(R.id.RootView));         System.gc();     } 

3) You can convert your hashmaps to WeakHashmaps, so that its memory would get released when the system runs low on memory.

4) You can scale/resize all your bitmaps. To scale bitmaps you can try something like this:

    BitmapFactory.Options options = new BitmapFactory.Options();     options.inSampleSize = 8;     Bitmap preview_bitmap=BitmapFactory.decodeStream(is, null, options); 

This inSampleSize option reduces memory consumption.

Here's a complete method. First it reads the image size without decoding the content itself. Then it finds the best inSampleSize value; it should be a power of 2. And finally the image is decoded.

// Decodes image and scales it to reduce memory consumption private Bitmap decodeFile(File f){     try {         // Decode image size         BitmapFactory.Options o = new BitmapFactory.Options();         o.inJustDecodeBounds = true;         BitmapFactory.decodeStream(new FileInputStream(f),null,o);          // The new size we want to scale to         final int REQUIRED_SIZE=70;          // Find the correct scale value. It should be the power of 2.         int scale=1;         while(o.outWidth/scale/2 >= REQUIRED_SIZE && o.outHeight/scale/2 >= REQUIRED_SIZE)             scale*=2;          // Decode with inSampleSize         BitmapFactory.Options o2 = new BitmapFactory.Options();         o2.inSampleSize=scale;         return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);     }     catch (FileNotFoundException e) {     }     return null; } 

Have a look at this link..

5) You can override onLowMemory() method in an activity which gets a call when entire system runs low on memory. You can release a few resources there.

6) You can make your objects SoftReference or Weakreference, so that they get released in a low-memory condition.

A very common memory leak that I observed is due to the implementation of inner classes and implementing Handler in Activity. This links talks about the same in more detail.

I hope this helps to eliminate your problem.

like image 57
N-JOY Avatar answered Oct 05 '22 22:10

N-JOY


This is a typical problem when using Android's ImageView with large images on older devices (even if the file size is only several Kbs). The native graphics library called skia that is used to decode the image allocates native memory based on the image's dimensions, so the file size does not influence this directly.

Even if you omit the src-attribute in the XML layout definition to load the image yourself in your onCreate() method the same error will be triggered. The only way to get around this is to use an inSampleSize in BitmapFactory.decodeStream to perform downsampling directly during decoding (see Strange out of memory issue while loading an image to a Bitmap object for example). This itself raises the question of how to determine this scale factor.

The best solution I found when handling large images is replacing the ImageView with a WebView and load some minimal HTML like this:

webView.loadUrl("file:///android_res/raw/background.html"); 

where the content of raw/background.html might be something like this:

<!DOCTYPE html> <html> <head>     <meta charset="UTF-8">     <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">     <style type="text/css">         body {             margin: 0;         }          img {             width: 100%;             height: auto;             display: block;         }     </style> </head> <body>     <img src="file:///android_res/drawable/background.png" /> </body> 

The WebKit engine that is used in the WebView performs image loading in a much more efficient way, so that those memory allocation errors should be gone.

You can even use different images for portrait and landscape by putting them in drawable-port and drawable-land. But then you have to call clearCache(false) on the WebView instance in your onDestroy() method because otherwise the image cached on the first load will always be used (disabling caching on the WebView instance does not work).

like image 20
Andreas Klöber Avatar answered Oct 05 '22 21:10

Andreas Klöber