Reciclar el bitmap de ImageView

Tengo algo como esto:

Bitmap.Config conf = Bitmap.Config.ARGB_8888; WeakReference bm = new WeakReference(Bitmap.createBitmap(3000 + 3000, 2000, conf)); Canvas canvas = new Canvas(bm.get()); canvas.drawBitmap(firstBitmap, 0, 0, null); canvas.drawBitmap(bm, firstBitmap.getWidth(), 0, null); imageView.setImageBitmap(bm); 

Y aplico esto en más de 10 imageView que se crean uno por uno. Cada vez que creo un nuevo ImageView, quiero reciclar el objeto ‘bm’ del primero, hacer que este código suba, hacer que mi montón crezca más y más y luego lanzar OutOfMemoryError , por lo que hago:

 bm.recycle() 

justo después de establecer el bitmap (bm) en el objeto imageView. Esto causa la excepción de que el canvas ImageView quiere dibujar Bitmap reciclado.

¿Cuál es la forma de reciclar un bitmap que ya se ha puesto como imagen en ImageView?

Graciasb

En su método onDestroy, podría intentar algo como esto:

 ImageView imageView = (ImageView)findViewById(R.id.my_image); Drawable drawable = imageView.getDrawable(); if (drawable instanceof BitmapDrawable) { BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable; Bitmap bitmap = bitmapDrawable.getBitmap(); bitmap.recycle(); } 

El elenco debería funcionar ya que setImageBitmap se implementa como

 public void setImageBitmap(Bitmap bm) { setImageDrawable(new BitmapDrawable(mContext.getResources(), bm)); } 

Si configura el mismo objeto de bitmap en todos sus ImageView , no debería arrojar un OutOfMemoryError . Básicamente, esto debería funcionar:

 WeakReference bm = new WeakReference(Bitmap.createBitmap(3000 + 3000, 2000, Bitmap.Config.ARGB_8888)); Canvas canvas = new Canvas(bm.get()); canvas.drawBitmap(firstBitmap, 0, 0, null); canvas.drawBitmap(bm, firstBitmap.getWidth(), 0, null); imageView1.setImageBitmap(bm.get()); imageView2.setImageBitmap(bm.get()); imageView3.setImageBitmap(bm.get()); imageView4.setImageBitmap(bm.get()); imageView5.setImageBitmap(bm.get()); // ... 

Si esto no funciona, simplemente significa que su bitmap es demasiado grande (6000×2000 píxeles son aproximadamente 12 megabytes, si calculé bien). Tu también puedes:

  • hacer su bitmap más pequeño
  • reducir otras cosas que usan mucha memoria

La respuesta de Devconsole es excelente, pero también puedes almacenar todos los objetos de bitmap como miembro de tu clase y luego reciclarlos en ciclo cuando el método de actividad onDestroy () o algún otro método de ciclo de vida de la versión del componente donde usas bitmap ser llamado.

No cree imágenes más grandes de lo que necesita a la vez. Las limitaciones del montón están diseñadas para evitar que se ahorque y se haga cargo por completo de la memoria limitada del dispositivo.

Si necesita más detalles porque planea acercarse, vuelva a procesar esa parte de la imagen con mayor detalle en el momento del zoom, excluyendo las partes que no está viendo.