Android – fuera de la excepción de memoria al crear mapa de bits

Estoy recibiendo el siguiente error después de crear bitmap segunda vez alrededor:

04-17 18:28:09.310: ERROR/AndroidRuntime(3458): java.lang.OutOfMemoryError: bitmap size exceeds VM budget this._profileBitmap = Bitmap.createBitmap(_profileBitmap, xCoor, yCoor, width, height); 

De registro:

 04-17 18:27:57.500: INFO/CameraCropView(3458): Original Photo Size: W 1536 x H 2048 04-17 18:28:06.170: INFO/CameraCropView(3458): xCoor: 291 04-17 18:28:06.170: INFO/CameraCropView(3458): yCoor: 430 04-17 18:28:06.170: INFO/CameraCropView(3458): Width: 952 04-17 18:28:06.170: INFO/CameraCropView(3458): Height: 952 

Puesto que la imagen es enorme consigo el error. Pero lo interesante es que el error no ocurre la primera vez, solo cuando tomo la foto la segunda vez, lo que me hace creer que este perfil no es destruido. ¿Cómo puedo limpiar esto?

    Tuve el mismo problema y solucionarlo de esta manera:

    Mi aplicación era ~ 18MB de peso, y cuando veo cuánta memoria dejó libre me sorprendió – 654KB (en 1 GB de RAM!). Así que acabo de eliminar casi todas las imágenes del proyecto y los descargó de Internet en el primer inicio, y utilizar fotos de la tarjeta SD cuando sea necesario.

    Para comprobar la memoria total / libre para tu aplicación, utiliza:

      Runtime.getRuntime().totalMemory(); Runtime.getRuntime().freeMemory(); 

    EDIT: Olvidé la cosa principal – agregue en su manifiesto, entre las etiquetas de la actividad, esta línea:

    Android: largeHeap = "true"

    Hay muchos problemas con excepciones de memoria con mapas de bits en Android, muchos de los cuales se discuten en stackoverflow. Probablemente sería mejor si usted pasó por las preguntas existentes para ver si el suyo coincide con uno de los existentes, entonces si no, escriba lo que hace que su situación diferente.

    Algunos ejemplos:

    Excepción de memoria debido al tamaño de mapa de bits grande

    Android: excepción de memoria en la Galería

    Manejo de Android fuera de la excepción de memoria en el procesamiento de imágenes

    Etc: https://stackoverflow.com/search?q=android+out+of+memory+exception+bitmap

    Esto sucede porque está cargando directamente el mapa de bits, que consume mucha memoria. En su lugar, utilice una versión reducida de la imagen en _profileBitmap. Este tipo lo explica bastante bien. http://androidcocktail.blogspot.in/2012/05/solving-bitmap-size-exceeds-vm-budget.html

    Consejos de procesamiento de mapa de bits android

    Ahora aquí están los consejos que puede seguir y puede evitar la excepción de memoria en su aplicación de Android.

    1. Utilice siempre el contexto de la actividad en lugar del contexto de la aplicación. Porque el contexto de aplicación no puede ser recolectado de basura. Y suelte los recursos a medida que termine su actividad. (El ciclo de vida del objeto debe ser el mismo que de la actividad).

    2. Cuando la actividad termina. Compruebe HEAP DUMP (herramienta de análisis de memoria en el estudio de Android).

    Si hay objetos en HEAP DUMP de actividad terminada hay pérdida de memoria. Revise su código e identifique qué está causando la pérdida de memoria.

    1. Utilizar siempre inSampleSize

    Ahora, ¿qué es inSampleSize? Con la ayuda de inSampleSize usted está diciendo realmente el decodificador para no agarrar cada píxel en la memoria, en lugar de la imagen de sub-muestra. Esto hará que se cargue menos número de píxeles en la memoria que la imagen original. Usted puede decir el decodificador para asir cada 4to pixel o cada segundo pixel de la imagen original. Si inSampleSize es 4. decodificador devolverá una imagen que es 1/16 el número de píxeles en la imagen original.

    ¿Cuánta memoria has guardado? Calcular

    1. Lea las dimensiones del mapa de bits antes de cargarlas en la memoria.

      Cómo leer las dimensiones del mapa de bits antes de cargar la imagen en la memoria puede ayudarle a evitar
      Error de memoria Aprendamos

      Use inJustBounds = true

    Aquí está la técnica con la ayuda de la cual usted puede conseguir la dimensión de la imagen beore cargarla en memoria

      BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.id.myimage, options); int imageHeight = options.outHeight; int imageWidth = options.outWidth; String imageType = options.outMimeType; 

    El fragmento de código anterior no nos dará ninguna imagen / mapa de bits. Devolverá null para objeto de mapa de bits. Pero definitivamente devolverá el ancho y la altura de esa imagen. Que es R.id.myimage.

    Ahora usted tiene anchura y altura de la imagen. Puede escalar o reducir la imagen basándose en estos factores:

    • ImageView tamaño que se utilizará para mostrar la imagen.
    • Cantidad disponible de memoria. Puede comprobar la cantidad disponible de memoria mediante ActivityManager y getMemoryClass.
    • Tamaño de la pantalla y densidad del dispositivo.

      1. Utilice la configuración de mapa de bits adecuada

      Las configuraciones de mapa de bits son el espacio de color / profundidad de color de una imagen. Configuración de bitmap predeterminada en Android es RGB_8888 que es de 4 bytes por píxel.

    Si utiliza RGB_565 canal de color que utilizan 2 bytes por píxel. La mitad de la asignación de memoria para la misma resolución 🙂

    1. Utilice la propiedad inBitmap para fines de reciclaje.

    2. No haga objetos dibujables estáticos ya que no se puede recolectar basura.

    3. Solicitar gran montón en el archivo de manifiesto.

    4. Utilice varios procesos si está haciendo mucho procesamiento de imágenes (uso intensivo de memoria) o use NDK (Native Development usando c, c ++)

    Puede intentar llamar a recycle () en el mapa de bits cuando haya terminado con él. Esto borrará todos los datos de imagen y liberará la memoria. Si algo intenta dibujar el mapa de bits después de esto, tu aplicación se bloqueará. Si obtiene un bloqueo, puede ayudarlo a averiguar qué es lo que todavía mantiene su mapa de bits.

    Usted podría utilizar un vector Drawable. Utiliza un archivo xml para describir tu imagen, por lo que consume menos memoria. Para ello debe utilizar el formato SVG para sus imágenes y luego generar el archivo xml utilizando una de estas dos soluciones:

    • Solución 1: Utilice el estudio de activos vectoriales en Android Studio: haga clic con el botón secundario en Archivo extraíble en su proyecto -> nuevo -> activo vectorial
    • Solución 2: Utilice el sitio web svg2android: https://inloop.github.io/svg2android

    Vea este enlace para más información:
    https://developer.android.com/studio/write/vector-asset-studio.html

    Tuve el mismo problema cuando el teléfono estaba apagado y encendido. Simplemente estableciendo los mapas de bits en null y llamando a System.gc (); Arregló todos los problemas.

    Con imágenes más grandes se puede evitar mediante muestreo en un tamaño más pequeño. Utilice el siguiente ejemplo:

      File f = new File(selectedImagePath); // First decode with inJustDecodeBounds=true to check dimensions final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeStream(new FileInputStream(f), null, options); // Calculate inSampleSize options.inSampleSize = calculateInSampleSize(options, 720, 1280); //My device pixel resolution // Decode bitmap with inSampleSize set options.inJustDecodeBounds = false; Bitmap bmpPic = BitmapFactory.decodeStream(new FileInputStream(f), null, options); Bitmap bmpPic1 = Bitmap.createBitmap(bmpPic, 0, 0, bmpPic.getWidth(), bmpPic.getHeight(), mat, true); img.setImageBitmap(bmpPic1); //img is your ImageView 

    Referencia – http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.