Sobes.tech
Middle

Sai come funziona la carta cache?

sobes.tech AI

Risposta dell'AI

La memoria cache (Memory Cache) in Android è un meccanismo di memorizzazione dei dati nella memoria RAM del dispositivo per un accesso rapido. Si basa sui principi della cache associativa.

Come funziona:

  1. Richiesta di dati: Quando si richiedono dati che possono essere memorizzati nella cache (ad esempio, un'immagine dalla rete o il risultato di un'operazione complessa), l'app verifica prima la cache.
  2. Ricerca nella cache: Se i dati vengono trovati nella cache (cioè, la chiave della richiesta corrisponde alla chiave nella cache), vengono restituiti immediatamente, evitando operazioni di input/output lente o calcoli. Questo è chiamato "cache hit".
  3. Cache miss: Se i dati non vengono trovati nella cache ("cache miss"), l'app li ottiene dalla fonte originale (rete, database, ecc.).
  4. Inserimento nella cache: Dopo aver ottenuto i dati, vengono inseriti nella cache per richieste future con la stessa chiave.
  5. Evitamento (Cache Eviction): La cache ha una dimensione limitata. Quando si riempie, gli elementi vecchi o meno utilizzati vengono rimossi per liberare spazio per nuovi dati. Gli algoritmi di rimozione comuni includono LRU (Least Recently Used) e LFU (Least Frequently Used).

Esempio di implementazione in Android usando LruCache:

// Creazione di un LruCache con dimensione massima
private LruCache<String, Bitmap> memoryCache;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Ottenere la dimensione massima della memoria disponibile per l'app (in KB)
    final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);

    // Usare 1/8 della memoria disponibile per la cache
    final int cacheSize = maxMemory / 8;

    memoryCache = new LruCache<String, Bitmap>(cacheSize) {
        @Override
        protected int sizeOf(String key, Bitmap bitmap) {
            // Metodo per calcolare la dimensione di ogni elemento della cache in unità,
            // in questo caso - KB
            return bitmap.getByteCount() / 1024;
        }
    };
}

// Aggiunta di un elemento alla cache
public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
    if (getBitmapFromMemCache(key) == null) {
        memoryCache.put(key, bitmap);
    }
}

// Ottenere un elemento dalla cache
public Bitmap getBitmapFromMemCache(String key) {
    return memoryCache.get(key);
}