Causado por: java.lang.OutOfMemoryError: tamaño de mapa de bits supera el presupuesto de VM
En mi aplicación cuando intento lanzar Force Closed y el error apuntando la línea "setContentView (R.layout.Menu)"; Del diseño. Y en el archivo XML muestra la vista de la imagen "OutOfMemoryError" en mi diseño. Estoy muy confundido. Por favor, guíame para más movimiento.
Editado:
- Android - Bitmap y gestión de la memoria?
- Bitmap Cache (SoftReference, Hard) en Lazy List no parece funcionar correctamente - Android
- Mapa personalizado de Android
- No mostrar mosaicos en la aplicación de mapas sin conexión de Android que utiliza osmdroid con el archivo MBTiles
- ¿Es posible mover un fondo de azulejos? (Scroll infinito con TileMode.REPEAT)
Mi aplicación utiliza base de datos, y en la primera vez que analizar algunos datos XML e insertar en la base de datos Sqlite. Mi problema Outofmemory se produce sólo en la primera vez. La segunda vez funciona bien. He intentado System.gc (). ¿Hay algún problema en eso.
Este es mi registro:
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)
Este es mi código XML:
<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>
- Cómo cambiar el color de ciertos píxeles en el mapa de bits de Android
- Analizar objeto JSON con cadena y sólo valor
- Android distancia entre dos puntos
- ¿Cómo puedo utilizar MapBox en Android
- Biblioteca de memoria de montón sin restricciones para mapas de bits mediante NDK en Android
- ¿Cómo puedo crear un mapa de bits enorme y blanco con Canvas?
- Cómo crear piezas de rompecabezas sin usar máscara?
- Cómo descargar osmdroid azulejos en el usuario final?
Supongo que el problema no está en su diseño; El problema está en otro lugar en su código. Y probablemente estás filtrando el contexto en alguna parte .
Otra razón probable es que debe crear objetos voluminosos múltiples al analizar su XML (como mencionó esto ocurre la primera vez que analiza XML). Aunque Java tiene un enfoque automático de recolección de basura, pero todavía no se puede confiar completamente en él. Es una buena práctica anular la instancia de la colección o borrar el contenido de los objetos cuando ya no los necesite.
Pero aún así he preparado una lista de puntos importantes que debe recordar al tratar con mapas de bits en Android.
1) Puede llamar a reciclar en cada mapa de bits y ponerlos en null. ( bitmap.recycle()
liberará toda la memoria utilizada por este mapa de bits, pero no anula el objeto de mapa de bits).
2) También puede desvincular los elementos drawables
asociados con los diseños cuando se destruye una actividad. Prueba el código que se indica a continuación y también echa un vistazo a este enlace .
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) Usted puede convertir sus hashmaps
a WeakHashmaps
, de modo que su memoria conseguiría lanzada cuando el sistema funciona bajo en memoria.
4) Puede escalar / cambiar el tamaño de todos sus mapas de bits. Para escalar mapas de bits, puede probar algo como esto:
BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 8; Bitmap preview_bitmap=BitmapFactory.decodeStream(is, null, options);
Esta opción inSampleSize reduce el consumo de memoria.
Aquí hay un método completo. Primero lee el tamaño de la imagen sin decodificar el contenido en sí. A continuación, encuentra el mejor valor inSampleSize; Debe ser una potencia de 2. Y finalmente la imagen es decodificada.
// 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; }
Echa un vistazo a este enlace. .
5) Puede anular el método onLowMemory()
en una actividad que obtiene una llamada cuando todo el sistema tiene poca memoria. Usted puede liberar algunos recursos allí.
6) Puede hacer que sus objetos SoftReference
o Weakreference
, para que se liberen en una condición de baja memoria.
Una pérdida de memoria muy común que observé se debe a la implementación de clases internas y la implementación de Handler
in Activity
. Esto vincula conversaciones sobre el mismo en más detalle .
Espero que esto ayude a eliminar su problema.
Este es un problema típico cuando se utiliza ImageView
de Android con imágenes grandes en dispositivos antiguos (incluso si el tamaño del archivo es sólo varios Kbs). La biblioteca gráfica nativa llamada skia que se utiliza para decodificar la imagen asigna memoria nativa en función de las dimensiones de la imagen, por lo que el tamaño del archivo no influye directamente en ella.
Incluso si omite el atributo src
en la definición de diseño XML para cargar la imagen usted mismo en su método onCreate()
, se disparará el mismo error. La única manera de evitar esto es usar un inSampleSize
en BitmapFactory.decodeStream
para realizar el BitmapFactory.decodeStream
directamente durante la decodificación (vea BitmapFactory.decodeStream
extraño de memoria al cargar una imagen en un objeto Bitmap, por ejemplo). Esto mismo plantea la cuestión de cómo determinar este factor de escala.
La mejor solución que encontré al manejar grandes imágenes es reemplazar el ImageView
con un WebView
y cargar un poco de HTML como este:
webView.loadUrl("file:///android_res/raw/background.html");
Donde el contenido de raw/background.html
podría ser algo como esto:
<!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>
El motor de WebKit que se utiliza en el WebView realiza la carga de imágenes de una manera mucho más eficiente, por lo que los errores de asignación de memoria debe haber desaparecido.
Incluso puede utilizar diferentes imágenes para el retrato y el paisaje, poniéndolos en drawable-port
y drawable-land
. Pero entonces usted tiene que llamar a clearCache(false)
en la instancia de WebView en su método onDestroy()
porque de lo contrario la imagen en caché en la primera carga siempre se utilizará (deshabilitar el almacenamiento en caché en la instancia de WebView no funciona).
Muchos dispositivos tienen memoria muy limitada y restringida disponible para cada dispositivo. Muchos dispositivos antiguos asignan 16 MB de memoria a su aplicación, mientras que algunos dispositivos más modernos pueden asignar 24 MB o incluso 32 MB (he visto un dispositivo con sólo 14 MB).
Siempre que cargues tantas imágenes en la memoria, este espacio se llena muy rápidamente haciendo que OutOfMemoryError sea lanzado. Para superar este problema, debes (como dijeron las respuestas anteriores) reducir las imágenes a las miniaturas y mantener sólo las miniaturas en la memoria del dispositivo (huella de memoria reducida) y tener las imágenes guardadas en SDCARD.
Puede ver la cantidad de memoria que su programa está usando desde el diseño de DDMS en Eclipse. Creo que también puede anular la clase de aplicación para escuchar una función de advertencia de "memoria baja".
Cuando lea el mapa de bits a través de BitmapFactory, establezca el parámetro BitmapFactory.Option inScaled en 2 o 4 (o lo que funcione para usted) para crear una imagen más pequeña y menos intensiva en memoria.
En general, sólo hay una solución: utilizar imágenes más pequeñas. Si no hay código, es difícil decir qué es exactamente lo que está mal. Puede intentar bajar el tamaño de la imagen.
Tuve el mismo problema antes y estaba depurando en S4 android 4.3. La solución fue: Copiar las imágenes de la carpeta mdpi a la carpeta hdpi (por lo que ahora están en ambas carpetas)
¡Sé raro! Pero esto resolvió mi problema.
Además de lo que la gente ha escrito aquí, sugiero ver este video de google, que apuntan a algunos problemas comunes de memoria y cómo encontrar la causa de su problema de memoria:
Gestión de memoria para aplicaciones de Android
Después de pasar mucho tiempo en este problema he encontrado la solución! Todo lo que necesitas hacer es pedir más memoria. Coloque este código dentro de su manifiesto android bajo:
<application>:
Poner:
android:largeHeap="true"
Funcionó muy bien para mí! Tenga en cuenta que esta solución sólo funciona en API 11 y superior.
Más información aquí.
Se cose como la imagen ur es de gran tamaño para que u pueda decodificar su imagen y el uso de android: largeHeap = "true". Dentro del manifiesto de Application Tag
Usted pudo haber pasado por todas las soluciones antedichas, pero todavía darle una prueba. Yo estaba perdido en encontrar una solución hasta que conseguí que funcione. Esto podría funcionar de noche para su caso (disculpe en ese caso).
MyIntent.setFlags (Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_TASK); MyIntent.setFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
Coloque estos antes de llamar a su actividad.
- Android – cómo definir ShapeDrawables mediante programación?
- Asociar un objeto con Marker (google map v2)