Middle
¿Sabes cómo funciona la tarjeta de caché?
sobes.tech AI
Respuesta de la IA
La memoria caché en Android (Memory Cache) es un mecanismo de almacenamiento de datos en la memoria RAM del dispositivo para un acceso rápido. Se basa en los principios de la caché asociativa.
Cómo funciona:
- Solicitud de datos: Cuando se solicitan datos que pueden ser almacenados en caché (por ejemplo, una imagen de la red o el resultado de una operación compleja), la aplicación primero verifica la memoria caché.
- Búsqueda en la caché: Si los datos se encuentran en la caché (es decir, la clave de la solicitud coincide con la clave en la caché), se devuelven inmediatamente, evitando operaciones de entrada/salida o cálculos lentos. Esto se llama "cache hit".
- Fallo de caché (Cache Miss): Si los datos no se encuentran en la caché ("cache miss"), la aplicación los obtiene de la fuente original (red, base de datos, etc.).
- Almacenamiento en caché: Después de obtener los datos, se colocan en la memoria caché para futuras solicitudes con la misma clave.
- Esvasiado (Cache Eviction): La caché tiene un tamaño limitado. Cuando se llena, los elementos antiguos o menos utilizados son desplazados para liberar espacio para nuevos datos. Los algoritmos comunes de desplazamiento incluyen LRU (Least Recently Used - menos recientemente utilizado) y LFU (Least Frequently Used - menos utilizado con frecuencia).
Ejemplo de implementación en Android usando LruCache:
// Creación de LruCache con tamaño máximo
private LruCache<String, Bitmap> memoryCache;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Obtención del tamaño máximo de memoria disponible para la aplicación (en KB)
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
// Usar 1/8 de la memoria disponible para la caché
final int cacheSize = maxMemory / 8;
memoryCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
// Método para calcular el tamaño de cada elemento en la caché en unidades,
// en este caso - KB
return bitmap.getByteCount() / 1024;
}
};
}
// Añadir elemento a la caché
public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
if (getBitmapFromMemCache(key) == null) {
memoryCache.put(key, bitmap);
}
}
// Obtener elemento de la caché
public Bitmap getBitmapFromMemCache(String key) {
return memoryCache.get(key);
}