Android: error de "intentar utilizar un mapa de bits reciclado" con Bitmaps temporales

Mi aplicación puede cargar imágenes muy grandes. En un esfuerzo por conservar la memoria, estoy intentando utilizar un bitmap 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 sólo se necesitaba para transportar el bitmap decodificado 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 muestra y sólo se utiliza allí mismo .

¿Qué pasa aquí? ¿Debo usar "finalBitmap" y confiar en createBitmap para gestionarlo ( finalBitmap = Bitmap.createBitmap ( finalBitmap , ….))? No puedo ver qué dependencia en curso de tempBitmap que habría que causaría tal fracaso.

Edit: Sí, la asignación nula parece resultar en la recopilación de basura apropiada, pero estoy desconcertado por qué recycle () en un bitmap de temp es tan problemático en este caso. Tengo la impresión de que createBitmap () es la celebración de una referencia a ella, pero ¿por qué, y por cuánto tiempo?

Directamente desde la documentación de 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 el origen o se puede haber realizado una copia.

Parece que las funciones createBitmap tienen el potencial de volver a utilizar el mapa de bits que proporcionó. Si ese es el caso, entonces no debería 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 sólo debería reciclar el tempBitmap cuando no es el mismo que el finalBitmap. Al menos eso parece ser lo que implica la documentación.

  • ¿Existe un reemplazo para el widget Galería con Reciclado de vistas?
  • Arrastrar y soltar entre dos RecyclerView
  • android RecyclerView setOnScrollChangeListener necesita api 23?
  • Cómo establecer el elemento al centro de la vista Reciclador cuando se selecciona
  • EditText en ListView sin reciclar entrada
  • Android RecyclerView Adapter está dando nulo en la prueba de unidad
  • Cómo implementar load más recyclerview en android
  • Barra de herramientas dentro de CardView para crear un menú emergente (icono de desbordamiento)
  • Determinar si el elemento es visible en RecyclerView
  • Checkbox listener en RecyclerView con DataBinding
  • Posiciones de superposición / vistas en la vista de reciclaje
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.