/ / ¿Cómo reciclar un mapa de bits y volver a utilizarlo más tarde? - Android, memoria, mapa de bits

¿Cómo reciclar un mapa de bits y usarlo más tarde otra vez? - Android, memoria, mapa de bits

Tengo que liberar memoria ocupada por mapas de bits. Así que estoy llamando recycle() en todos ellos, cuando terminen mis actividades.

Estos mapas de bits se utilizan siempre en dibujables, como propiedad de fondo o fuente (caso de ImageView) propiedad.

Pero el problema es que cuando más tarde otra actividad tenga una vista que también use estos mapas de bits, se mostrará

java.lang.RuntimeException: Canvas: tratando de usar un mapa de bits reciclado.

¿Qué puedo hacer? No puedo guardar los mapas de bits en la memoria solo porque tal vez el usuario inicia, en algún momento después, una actividad que los utiliza. ¿Cómo puedo indicar los mapas de bits a la memoria libre y también se puede utilizar más tarde?

Respuestas

2 para la respuesta № 1

La solución es inicializar Bitmap y View usando esto:

Bitmap b = BitmapFactory.decodeResource(resources, R.drawable.mybitmap);
view.setBackgroundDrawable(new BitmapDrawable(b));

Esto no funciona para los mapas de bits XML aunque. Pero el mapa de bits debe ser recuperable de la vista.

Al tener la instancia de mapa de bits en la memoria, es posible llamar a recycle () para liberar memoria de inmediato.

Y antes de Reciclando el mapa de bits hay que asegurarse de queYa no se hace referencia a ninguna vista, ya que se establecen las referencias de drawable / view en null. De lo contrario, se lanzará la excepción. Para hacer esto, es necesario realizar un seguimiento de las vistas que hacen referencia a un mapa de bits y null. Todas las referencias antes de reciclarlo.

Así que mi problema real no era reutilizar el mapa de bits. El problema fue reciclar el mapa de bits, mientras que una vista aún hace referencia a él.


0 para la respuesta № 2

Si todo lo que usas Bitmaps para es Drawables y android:source de ImageViews, entonces porque tienes Bitmap objetos en absoluto? Android se ocupará del uso óptimo de la memoria en esos casos y no hay necesidad de llamar recycle() en absoluto.


0 para la respuesta № 3

Puede comprobar si el mapa de bits se recicla con bitmap.isRecycled(). Si este método devuelve verdadero, puede reinicializar el mapa de bits. Algo como esto:

if(bitmap != null && bitmap.isRecycled()) {
//Reinitialize the image
}
else {
//The bitmap is not recycled, you can use it
}