Estoy pensando en implementar la primera capa de almacenamiento en caché en una aplicación de Android. Estaba considerando SoftReferences para evitar las excepciones de OOM, pero dado que hay muchos artículos sobre cómo Android los libera "demasiado pronto", decidí buscar en el caché de android.util.LruCache.Tamaño LRU Caché de acuerdo con las capacidades del dispositivo y la memoria libre
Pregunta: ¿Cómo puedo clasificarlo correctamente para el dispositivo real? Todo suena muy bien que una caché LRU es la solución real y no SoftReferences, pero si realmente desea evitar las excepciones OOM, se siente extremadamente inseguro con cualquier número de megabytes de referencias difíciles. Es inseguro si me preguntas. De todos modos, esta parece ser la única opción. Estaba buscando en getMemoryClass para averiguar el tamaño de almacenamiento dinámico de la aplicación en el dispositivo real (+ comprobando el tamaño de almacenamiento dinámico libre antes de dimensionar la caché). La línea de base es de 16 Megas, lo que suena bien, pero he visto dispositivos (G1, por ejemplo, en los viejos tiempos) lanzando excepciones de OOM con solo unos 5 megabytes de tamaño de almacenamiento dinámico (de acuerdo con Eclipse MAT). Sé que un G1 es muy antiguo, pero el punto es que mis experiencias realmente no se alinean con la línea de base de 16 Megs que menciona la documentación. Por lo tanto, estoy completamente inseguro sobre cómo debo escalar un caché LRU si necesito lo más que puedo obtener razonablemente. (Sería feliz con 8 Megs e iría con tan solo 1 Meg en un dispositivo de baja especificación)
Gracias por cualquier pista.
Editar: La clase de caché LRU Android que me refiero: http://developer.android.com/reference/android/util/LruCache.html
Sí, terminé usando la clase de memoria de una manera similar. Todavía me parece una gran conjetura, pero no encontré un método más exacto. – user289463
Asegúrese de que sizeOf también devuelva el tamaño en bytes. En el enlace de arriba, devolvieron bitmap.getByteCount()/1024 (¡en kilobytes! Esto funciona, por supuesto, pero luego su cacheSize debería ser 1024 * memClass/8) – DominicM