Sobes.tech
Middle

Știi cum funcționează cardul de cache?

sobes.tech AI

Răspuns de la AI

Cache-ul de memorie (Memory Cache) în Android este un mecanism de stocare a datelor în memoria RAM a dispozitivului pentru acces rapid. Se bazează pe principiile cache-ului asociativ.

Cum funcționează:

  1. Solicitarea de date: Când se solicită date care pot fi stocate în cache (de exemplu, o imagine din rețea sau rezultatul unei operații complexe), aplicația verifică mai întâi cache-ul.
  2. Căutare în cache: Dacă datele sunt găsite în cache (adică, cheia solicitării corespunde cu cheia din cache), acestea sunt returnate imediat, evitând operații lente de intrare/ieșire sau calcule. Aceasta se numește "cache hit".
  3. Miss cache: Dacă datele nu sunt găsite în cache ("cache miss"), aplicația le obține din sursa originală (rețea, bază de date etc.).
  4. Plasarea în cache: După obținerea datelor, acestea sunt plasate în cache pentru solicitări viitoare cu aceeași cheie.
  5. Evacuare (Cache Eviction): Cache-ul are o dimensiune limitată. Când se umple, elementele vechi sau mai puțin utilizate sunt eliminate pentru a face loc pentru altele noi. Algoritmii obișnuiți de evacuare includ LRU (Least Recently Used) și LFU (Least Frequently Used).

Exemplu de implementare în Android folosind LruCache:

// Crearea unui LruCache cu dimensiune maximă
private LruCache<String, Bitmap> memoryCache;

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

    // Obținerea dimensiunii maxime de memorie disponibile pentru aplicație (în KB)
    final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);

    // Folosim 1/8 din memoria disponibilă pentru cache
    final int cacheSize = maxMemory / 8;

    memoryCache = new LruCache<String, Bitmap>(cacheSize) {
        @Override
        protected int sizeOf(String key, Bitmap bitmap) {
            // Metodă pentru calcularea dimensiunii fiecărui element din cache în unități,
            // aici - KB
            return bitmap.getByteCount() / 1024;
        }
    };
}

// Adăugarea unui element în cache
public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
    if (getBitmapFromMemCache(key) == null) {
        memoryCache.put(key, bitmap);
    }
}

// Obținerea unui element din cache
public Bitmap getBitmapFromMemCache(String key) {
    return memoryCache.get(key);
}