Error de memoria insuficiente al cargar mapas de bits

tengo una aplicación para Android con 3 acitivtys:

A1 – comienza -> A2 – comienza -> A3 – cuando termina su proceso: comienza -> A1

(Así que no “finish ();” una aplicación. Comienzo las siguientes actividades con “startActivity (..);” todo el tiempo después de la interacción con el usuario)

entonces hay un ciclo en estas 3 actividades. En cada actividad, muestro de 3 a 9 imágenes, ubicadas en la tarjeta SD, que cargo con mi siguiente función:

try { Uri selectedImageURI = Uri.parse(strImagePath); File imgFile = new File(getRealPathFromURI(selectedImageURI, c)); Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); ivTmp.setImageBitmap(myBitmap); }catch (Exception e) { return null; } 

Todo esto funciona Pero a veces (después de un bucle varias veces a través de mis actividades), mi aplicación falla.

Logcat me dice:

 01-16 13:42:15.863: DEBUG/dalvikvm(23161): GC_BEFORE_OOM freed 10K, 9% free 59019K/64400K, paused 29ms, total 30ms 01-16 13:42:15.863: ERROR/dalvikvm-heap(23161): Out of memory on a 8018704-byte allocation. 01-16 13:42:15.863: ERROR/AndroidRuntime(23161): FATAL EXCEPTION: main java.lang.OutOfMemoryError at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:502) at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:355) at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:785) at android.content.res.Resources.loadDrawable(Resources.java:1965) at android.content.res.Resources.getDrawable(Resources.java:660) at android.widget.ImageView.resolveUri(ImageView.java:616) at android.widget.ImageView.setImageResource(ImageView.java:349) at .MyActivity$6.run(MyActivity.java:143) at android.os.Handler.handleCallback(Handler.java:725) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5039) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) at dalvik.system.NativeStart.main(Native Method) 

¿Alguien puede dar mis consejos sobre cómo manejar los lockings? Tal vez se deba a que mis actividades están configuradas para indicar “en pausa” en lugar de cerrarlas correctamente.

para una solución rápida puede agregar

android:largeHeap="true" en su etiqueta de aplicación de manifiesto

enlace aquí:

Me enfrento al problema de OOM para mi mesa en kindle and rincón

 Heap size (large) android:largeHeap="true" 

allí se menciona la especificación para usar un enlace de montón más grande aquí:

editar: use el enlace de la técnica Caching Bitmaps aquí

Tuve el problema similar al mostrar imágenes de alta resolución. Busqué y apliqué todas las soluciones de mapas de bits de Android que se encuentran en http://developer.android.com/training/displaying-bitmaps/index.html y en el siguiente enlace almacena el mekanismo en el enlace. pero ninguno de ellos funciona ninguna solución correcta en ninguna parte. Luego descubrí que el problema es: no pude usar la estructura de carpetas dibujables a la derecha. Guardaba imágenes de alta resolución en carpetas mdpi y hdpi. esto causa que Android escale las imágenes a los tamaños ultra. La imagen de 100 kb estaba causando un aumento de 20 mb de memoria gracias a la sección de monitor / memoria de Android. así que agregué estas imágenes de resolución ultra a la carpeta xxhdpi, luego se arregló de repente. entonces mi deslizador de imagen funciona sin problemas

Sí, Android no destruye inmediatamente las actividades cuando no son visibles para el usuario, pero hay una serie de métodos de ciclo de vida que se llaman dependiendo del estado actual. Consulte http://developer.android.com/guide/components/activities.html#Lifecycle

Podría intentar finalizar las actividades en onStop () o onDestroy () ya que se llamarán cuando la actividad no esté visible y cuando el sistema tenga poca memoria, respectivamente. 🙂

Esto se debe a la alta resolución de la imagen que tiene para escalar el bitmap use el siguiente código

  Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); int h = 100; // height in pixels int w = 100; // width in pixels Bitmap photoBitMap = Bitmap.createScaledBitmap(myBitmap,h, w, true); ivTmp.setImageBitmap(photoBitMap);