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ă:
- 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.
- 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".
- 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.).
- Plasarea în cache: După obținerea datelor, acestea sunt plasate în cache pentru solicitări viitoare cu aceeași cheie.
- 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);
}