Middle
Sais-tu comment fonctionne la carte cache?
sobes.tech IA
Réponse de l'IA
Le cache mémoire (Memory Cache) sur Android est un mécanisme de stockage de données dans la mémoire vive de l'appareil pour un accès rapide. Il est basé sur les principes du cache associatif.
Comment ça fonctionne :
- Requête de données : Lorsqu'une requête de données pouvant être mise en cache est effectuée (par exemple, une image provenant du réseau ou le résultat d'une opération complexe), l'application vérifie d'abord le cache.
- Recherche dans le cache : Si les données sont trouvées dans le cache (c'est-à-dire que la clé de la requête correspond à la clé dans le cache), elles sont renvoyées immédiatement, évitant des opérations d'entrée/sortie ou des calculs lents. Cela s'appelle un "cache hit".
- Cache miss : Si les données ne sont pas trouvées dans le cache ("cache miss"), l'application les récupère de la source d'origine (réseau, base de données, etc.).
- Mise en cache : Après avoir obtenu les données, elles sont placées dans le cache pour de futures requêtes avec la même clé.
- Éviction du cache : Le cache a une taille limitée. Lorsqu'il est plein, les éléments anciens ou moins utilisés sont évincés pour libérer de l'espace pour de nouvelles données. Les algorithmes courants d'éviction incluent LRU (Least Recently Used - le moins récemment utilisé) et LFU (Least Frequently Used - le moins fréquemment utilisé).
Exemple d'implémentation en Android utilisant LruCache :
// Création d'un LruCache avec une taille maximale
private LruCache<String, Bitmap> memoryCache;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Obtention de la taille maximale de mémoire disponible pour l'application (en Ko)
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
// Utiliser 1/8 de la mémoire disponible pour le cache
final int cacheSize = maxMemory / 8;
memoryCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
// Méthode pour calculer la taille de chaque élément du cache en unités,
// ici - Ko
return bitmap.getByteCount() / 1024;
}
};
}
// Ajouter un élément au cache
public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
if (getBitmapFromMemCache(key) == null) {
memoryCache.put(key, bitmap);
}
}
// Récupérer un élément du cache
public Bitmap getBitmapFromMemCache(String key) {
return memoryCache.get(key);
}