Search code examples
androidandroid-drawableandroid-imageandroid-bitmap

bitmap size exceeds VM budget in some devices


I am doing android app, works fine in a device with 3Gb Ram but bad in a device with 512 mbRam. I am getting error "bitmap size exceeds VM budget" I don´t know how solve it. This is my layout´s code that uses many drawables.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/fondohis"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="#333"
        android:gravity="bottom"
        android:orientation="vertical" >

        <Button
            android:id="@+id/button4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button" />

        <Button
            android:id="@+id/button3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button" />

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button" />

        <Button
            android:id="@+id/button5"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button" />

    </LinearLayout>

    <LinearLayout
        android:id="@+id/container_2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/fondo_menu"
        android:orientation="vertical" >

        <ScrollView
            android:id="@+id/scrollView1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/transparent_negro"
            android:scrollbars="none" >

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical" >

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" >

                    <LinearLayout
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="0.5"
                        android:gravity="center_vertical|center_horizontal"
                        android:orientation="vertical" >

                        <ImageView
                            android:id="@+id/image_episodio1"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:src="@drawable/athle" />

                        <TextView
                            android:id="@+id/episodio1"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="Los orígenes"
                            android:textColor="#FFFFFF" />

                    </LinearLayout>

                    <LinearLayout
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="0.5"
                        android:gravity="center_vertical|center_horizontal"
                        android:orientation="vertical" >

                        <ImageView
                            android:id="@+id/image_episodio2"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:src="@drawable/pentl" />

                        <TextView
                            android:id="@+id/episodio2"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="Primera"
                             android:textColor="#FFFFFF" />
                    </LinearLayout>
                </LinearLayout>

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                     >

                    <LinearLayout
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="0.5"
                        android:orientation="vertical"
                        android:gravity="center_vertical|center_horizontal" >

                        <ImageView
                            android:id="@+id/image_episodio3"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:src="@drawable/delant" />

                        <TextView
                            android:id="@+id/episodio3"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="Segund"
                             android:textColor="#FFFFFF" />
                    </LinearLayout>

                    <LinearLayout
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="0.5"
                        android:orientation="vertical" 
                        android:gravity="center_vertical|center_horizontal">

                        <ImageView
                            android:id="@+id/image_episodio4"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:src="@drawable/cambios_mini" />

                        <TextView
                            android:id="@+id/episodio4"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="É"
                             android:textColor="#FFFFFF" />
                    </LinearLayout>
                </LinearLayout>

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" >

                    <LinearLayout
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="0.5"
                        android:orientation="vertical"
                        android:gravity="center_vertical|center_horizontal" >

                        <ImageView
                            android:id="@+id/image_episodio5"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:src="@drawable/niev" />

                        <TextView
                            android:id="@+id/episodio5"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="Debut"
                             android:textColor="#FFFFFF" />
                    </LinearLayout>

                    <LinearLayout
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="0.5"
                        android:orientation="vertical"
                        android:gravity="center_vertical|center_horizontal" >

                        <ImageView
                            android:id="@+id/image_episodio6"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:src="@drawable/aldeanos" />

                        <TextView
                            android:id="@+id/episodio6"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="La"
                             android:textColor="#FFFFFF" />
                    </LinearLayout>
                </LinearLayout>

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" >

                    <LinearLayout
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="0.5"
                        android:orientation="vertical"
                        android:gravity="center_vertical|center_horizontal" >

                        <ImageView
                            android:id="@+id/image_episodio7"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:src="@drawable/ir" />

                        <TextView
                            android:id="@+id/episodio7"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="ss"
                             android:textColor="#FFFFFF" />
                    </LinearLayout>

                    <LinearLayout
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="0.5"
                        android:orientation="vertical"
                        android:gravity="center_vertical|center_horizontal">

                        <ImageView
                            android:id="@+id/image_episodio8"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:src="@drawable/fin" />

                        <TextView
                            android:id="@+id/episodio8"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="kk" 
                             android:textColor="#FFFFFF"/>
                    </LinearLayout>
                </LinearLayout>

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" >

                    <LinearLayout
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="0.5"
                        android:gravity="center_vertical|center_horizontal"
                        android:orientation="vertical" >

                        <ImageView
                            android:id="@+id/image_episodio9"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:src="@drawable/gaba" />

                        <TextView
                            android:id="@+id/episodio9"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="em"
                             android:textColor="#FFFFFF" />
                    </LinearLayout>

                    <LinearLayout
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="0.5"
                        android:gravity="center_vertical|center_horizontal"
                        android:orientation="vertical" >

                        <ImageView
                            android:id="@+id/image_episodio10"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:src="@drawable/bie" />

                        <TextView
                            android:id="@+id/episodio10"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="yy" 
                             android:textColor="#FFFFFF"/>
                    </LinearLayout>
                </LinearLayout>
            </LinearLayout>

        </ScrollView>

    </LinearLayout>

    <LinearLayout
        android:id="@+id/container_iribar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/fondohis"
        android:gravity="center_vertical|center_horizontal"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/imageView4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/historiacuatro" />

    </LinearLayout>

    <LinearLayout
        android:id="@+id/container_zarra"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/fondohis"
        android:gravity="center_vertical|center_horizontal"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/imageView3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/historiatres" />

    </LinearLayout>

    <LinearLayout
        android:id="@+id/container_pichichi"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/fondohis"
        android:gravity="right|center_vertical"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/imageView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/historiados" />

    </LinearLayout>

    <LinearLayout
        android:id="@+id/container_histo"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/fondohis"
        android:gravity="bottom|left"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/icono_comentario"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/historiauno" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/menu_capa"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_centerVertical="true"
        android:background="@drawable/fondohis"
        android:gravity="center_vertical|center_horizontal"
        android:orientation="vertical" >

        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button"
            android:visibility="gone" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/transparent_negro"
            android:gravity="center_vertical|center_horizontal"
            android:orientation="vertical" >

            <TextView
                android:id="@+id/titulo_portada"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/circle"
                android:text="Gure"
                android:textColor="#FFFFFF"
                android:textSize="50sp" />

            <TextView
                android:id="@+id/titulo_anos"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="TextView"
                android:textColor="#ffffff"
                android:textSize="40sp" />

        </LinearLayout>

    </LinearLayout>

</RelativeLayout>

I have using this that I have read in other questions but I can´t solve it:

 @Override
        protected void onDestroy() {
            super.onDestroy();

            unbindDrawables(findViewById(R.id.RootView));
            System.gc();
        }

        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();
            }
        }

Solution

  • 1. For dealing with Bitmap objects:

    BitmapFactory.Options options=new BitmapFactory.Options();
    options.inSampleSize = 8;
    options.inDither = false;
    options.inPurgeable = true;
    options.inInputShareable = true;
    Bitmap bitmap = BitmapFactory.decodeStream(is, null, options);
    

    Also, you need to use

    bitmap.recycle();
    

    before you make your Bitmap instances null. This will help save memory.

    2. For dealing with images in res/drawable:

    • Add the android:largeHeap=“true” attribute to the application tag in your project's manifest file.
    • Resize your images with a graphics editor and reduce their size & dimension.

    Note: One of the answers says that "This error will only be visible in logcat, it won't affect your application." So yes, that is entirely false. An OutOfMemoryError is a Java Error, even more pernicious than a RuntimeException. It will bring the app to its knees.