libreria glide example bitmaps android memory-management bitmap recycle

glide - Android: error "intentar usar un mapa de bits reciclado" con mapas de bits temporales



libreria glide android (1)

Directamente de la documentation Android:

Devuelve un mapa de bits inmutable del subconjunto especificado del mapa de bits de origen. El nuevo mapa de bits puede ser el mismo objeto que la fuente, o se puede haber hecho una copia.

Parece que las funciones createBitmap tienen el potencial de reutilizar el mapa de bits que proporcionó. Si ese es el caso, entonces no debe reciclar el mapa de bits temporal ya que su mapa de bits final lo está utilizando. Una cosa que puedes hacer es

if(tempBitmap != finalBitmap) { tempBitmap.recycle(); }

Eso solo debería reciclar el tempBitmap cuando no es el mismo que el finalBitmap. Al menos eso parece ser lo que implica la documentación.

Mi aplicación puede cargar imágenes bastante grandes. En un esfuerzo por ser conservador de memoria, estoy intentando usar un mapa de bits temporal para cargar y otro para la imagen final después de la transformación:

..... finalBitmap.recycle(); finalBitmap = null; Bitmap tempBitmap = BitmapFactory.decodeStream(fin, ...); finalBitmap = Bitmap.createBitmap(tempBitmap, ....); imgview.setImageBitmap(finalBitmap); .....

Ahora, en este punto, hemos terminado con tempBitmap, que solo era necesario para transportar el Bitmap descodificado al paso de transformación en createBitmap. Asi que:

..... tempBitmap.recycle(); tempBitmap = null; .....

Y ... se bloquea con un error de "intentar usar un mapa de bits reciclado" específicamente debido al reciclaje de tempBitmap. tempBitmap no se mostró y solo se usa allí .

¿Qué está mal aquí? ¿Debo usar "finalBitmap" en todo momento y confiar en createBitmap para administrarlo ( finalBitmap = Bitmap.createBitmap ( finalBitmap , ....))? No veo qué dependencia continua en tempBitmap habría que causaría tal falla.

Edición: Sí, la asignación nula parece dar como resultado la recolección de basura apropiada y eventual , pero estoy desconcertado respecto de por qué reciclar () en un mapa de bits temporal es tan problemático en este caso. Me da la impresión de que createBitmap () tiene una referencia a él, pero ¿por qué y por cuánto tiempo?