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 № 1La 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 Bitmap
s para es Drawable
s y android:source
de ImageView
s, 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
}