Hasta ahora estoy usando un caché SoftReference para imágenes en Android. Este caché se usa para las imágenes que se muestran en ListViews y debería ayudar a mantener las imágenes de los elementos en la memoria que no se muestran en la pantalla, si queda suficiente memoria.¿Cómo implementar un caché de imagen en la memoria en Android?
El problema con esto es que SoftReferences se recogen basura casi en el mismo momento en que se lanza la última referencia. El resultado de esto es que una imagen que se elimina de la pantalla es basura recolectada en ese momento y si el usuario se desplaza de regreso a esta entrada en ListView, la imagen se recarga desde la memoria interna del teléfono, lo que resulta en un complejo proceso de carga diferida, lo que resulta en frecuentes rediseños de la lista y mal desempeño general.
El bug request para el comportamiento de referencia suave indica que este es el comportamiento previsto y que debe utilizar un LRU-Cache para almacenar en caché este tipo de cosas.
Sepa mi pregunta. La memoria caché LRU solo tomará tanta memoria como yo le permita. Pero si la aplicación necesita mucha memoria, no liberará la memoria. ¿Cómo debo determinar cuánta memoria puedo permitir que use la memoria caché, y existe una forma de reducir el tamaño de la memoria caché si la situación de la memoria del teléfono se reduce?
Por el momento, la memoria caché de imágenes se guarda dentro de la aplicación como un tipo de almacenamiento de imágenes global para todas las actividades. Esto daría como resultado que mi aplicación utilizara constantemente toda la memoria de la caché de imágenes, incluso si mis actividades están en segundo plano o destruidas.
gracias por la respuesta – Janusz
No puedo ver cómo el uso de LruCache solucionaría el problema del almacenamiento en caché de imágenes o cualquier otro BLOB para el caso. El problema es su tamaño fijo, del cual cada entrada contiene una fuerte referencia al objeto en caché. Eso no se escalará con la memoria del dispositivo. – Matthias
LruCache expulsa las entradas cuando su tamaño supera el límite establecido. Puede anular un método para ayudar a LruCache a medir el tamaño de cada entrada. –