2011-06-07 14 views
9

Estoy en una situación en la que he usado un bucle for para descargar un conjunto de imágenes y lo estoy convirtiendo en imágenes de mapa de bits. Entonces, para evitar el error OutOfMemory, estoy tratando de reciclar los mapas de bits. Pero desafortunadamente me encuentro con otra excepción que dice algo como "View trying to use a recycled bitmap".Diff b/w bitmap.recycle() y bitmap = null

Pero aún así puedo anular el mapa de bits utilizado usando bitmap=null. Entonces, mi pregunta es, ¿será útil hacer que mi mapa de bits null me ayude a liberar la memoria utilizada? ¿O debería proporcionar bitmap.recycle() en alguna otra parte de mi código?

+1

siguiendo g link brinda más información sobre la administración de la memoria Bitmap: http://stackoverflow.com/questions/4959485/bitmap-bitmap-recycle-weakreferences-and-garbage-collection –

Respuesta

7

Llamar al recycle() indica al sistema que ha terminado de usar ese recurso y que el sistema ahora puede liberar la memoria no administrada que estaba utilizando. Una vez que haya eliminado un recurso de esta manera, su comportamiento por lo general no está definido (es razonable esperar que simplemente no funcione).

Configuración de la referencia a null después tiene dos beneficios:

  • No tendrá referencias a objetos obsoletos que no funcionan cuando intenta utilizarlos
  • El recolector de basura sabrá que tiene que limpiar por el lado gestionado del objeto de mapa de bits, liberando aún más la memoria
7

No hay forma garantizada de forzar una recolección de basura, solo una manera de sugerir uno usando System.gc(). Dado que los datos de píxeles de bitmaps viven en la memoria nativa fuera del montón dalvik, proporcionar una función nativa (en este caso recycle()) nos dará la oportunidad de limpiar estos datos de píxeles con seguridad (eventualmente). Tenga en cuenta que al usar recycle() no hay mucho más que pueda hacer con ese mapa de bits.

El problema que está teniendo es que está llamando al recycle() en un mapa de bits, que todavía está tratando de usar.

Para responder a su pregunta, sí, establecer el mapa de bits en nulo después de haberlo reciclado es una buena idea, pero también puede ser redundante. Siempre trate de reciclar sus bitmaps cuando haya terminado con ellos.

+4

'Siempre trate de reciclar sus bitmaps cuando haya terminado con ellos' esta es mi pregunta. ¿Dónde debería proporcionar reciclaje? Si trato de proporcionar dentro del bucle for, la aplicación se bloquea. Pero quiero reciclar todo lo que pueda. Entonces, ¿dónde puedo tener mi método de reciclaje exactamente? –

-3

a llamarlo bitmap.recycle() en el método onStop ............. u va a resolver el problema ..

+0

¡Esto está mal! A menos que sepa lo que 'recycle()' hace. – Varun

Cuestiones relacionadas