Imagen de mapa de bits sin memoria

Sé que hay una gran cantidad de discusión sobre las imágenes de mapa de bits de Android de memoria, pero me preguntaba si alguien podría explicar a mí ..

Actualmente en mi aplicación tengo una actividad que muestra una imagen en miniatura (baja calidad) y cuando hago clic en una imagen se abre una nueva actividad para ver la imagen a pantalla completa. En mi segunda clase de actividad tengo:

BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 1; bm = BitmapFactory.decodeFile(myImagePath, options); 

A continuación, poner esto en un ImageView para mostrarlo. Esto funciona y muestra mi imagen a su máxima calidad. Sin embargo, si vuelvo a hacer clic y vuelvo a ver la imagen de nuevo (y repetir esto 6 veces) .. en la sexta vez que se abre la imagen (activity2) Tengo un error fuera de memoria diciendo Heap tamaño = 6919KB, asignado = 3125KB, mapa de bits Tamaño = 25848KB!

¿Cómo es el tamaño de mapa de bits que grande? Asumí que puede estar creando nuevas instancias todo el tiempo, así que decidí poner un método en mi segunda actividad para cuando la tecla de regreso es presionado .. y en este método establezco mi bitmap = null y también hizo System.gc () Para limpiar el recolector de basura, pero esto no solucionar el problema. Todavía obtengo un error de memoria incompleta al sexto momento de hacer clic en la miniatura para ver la imagen en resolución completa

¿Puede alguien explicar por qué? Gracias

2 Solutions collect form web for “Imagen de mapa de bits sin memoria”

Hay una gran información de android que explica todo en detalle, y cómo superar este problema aquí .

Cada píxel es de 4 bytes. 6M Pixel = 24MBs

Una foto puede usar toda la memoria.

Los mapas de bits ocupan mucha memoria, especialmente para imágenes ricas como fotografías. Por ejemplo, la cámara en el Nexus Galaxy toma fotos hasta 2592×1936 píxeles (5 megapíxeles). Si la configuración de mapa de bits utilizada es ARGB_8888 (la predeterminada desde Android 2.3), la carga de esta imagen en la memoria ocupa aproximadamente 19MB de memoria (2592 * 1936 * 4 bytes), agotando inmediatamente el límite por aplicación en algunos dispositivos.

Una vez más te señalo a este gran enlace que encontré de otra Pregunta de SO que tiene tutoriales de cómo superar adecuadamente el problema.

El tamaño de inSample se debe establecer de modo que la imagen se ajuste al tamaño del área de visualización (1 = tamaño completo) a menos que haya alguna razón por la que piensa que necesita todos los bits de la imagen, de modo que 2 = escala 1/2 4 1 / 4 escala etc.

También intente bm.recycle () cuando haya terminado con el mapa de bits antes de usar = null

Actualizar

Mira a la segunda respuesta lo que hace reciclar a menos que ya lo han intentado y no funcionó. He hecho cosas similares con la carga de imágenes y nunca se queda sin memoria, eso no es prueba de que va a funcionar para usted, pero es una buena práctica en la medida de lo que puedo decir.

  • Reproducción de vídeo en un GLSurfaceView en lugar de SurfaceView
  • Android: detener la reducción de la imagen
  • Cómo averiguar si una vista de Android está oscurecida por cualquier otra vista
  • Colocación / superposición (índice-z) una vista encima de las pestañas de la barra de acciones
  • GetWidth () y getHeight devuelven cero después de onMeasure () (dispositivos específicos)
  • Android: ¿Cómo hacer una vista previa de cámara en forma de círculo?
  • agregar imagen a la vista de la superficie en android
  • Cómo tener un ImageButton transparente: Android
  • Android Move ImageView
  • ViewPager omitir las vistas de devolución dejando en blanco
  • Toca dos vistas al mismo tiempo en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.