Middle
Czy wiesz, jak działa karta pamięci podręcznej?
sobes.tech AI
Odpowiedź od AI
Pamięć podręczna (Memory Cache) w Androidzie to mechanizm przechowywania danych w pamięci RAM urządzenia dla szybkiego dostępu. Opiera się na zasadach pamięci podręcznej asocjacyjnej.
Jak to działa:
- Żądanie danych: Gdy żądane są dane, które mogą być przechowywane w pamięci podręcznej (np. obraz z sieci lub wynik złożonej operacji), aplikacja najpierw sprawdza pamięć podręczną.
- Wyszukiwanie w pamięci podręcznej: Jeśli dane zostaną znalezione w pamięci podręcznej (tzn. klucz żądania odpowiada kluczowi w pamięci podręcznej), są one natychmiast zwracane, unikając wolnych operacji wejścia/wyjścia lub obliczeń. Nazywa się to "cache hit".
- Miss cache: Jeśli dane nie zostaną znalezione w pamięci podręcznej ("cache miss"), aplikacja pobiera je z oryginalnego źródła (sieć, baza danych itp.).
- Umieszczenie w pamięci podręcznej: Po otrzymaniu danych, umieszcza się je w pamięci podręcznej na przyszłe żądania z tym samym kluczem.
- Wypieranie (Cache Eviction): Pamięć podręczna ma ograniczony rozmiar. Gdy jest pełna, starsze lub mniej używane elementy są usuwane, aby zwolnić miejsce dla nowych. Popularne algorytmy wypierania to LRU (Least Recently Used) i LFU (Least Frequently Used).
Przykład implementacji w Androidzie z użyciem LruCache:
// Tworzenie LruCache z maksymalnym rozmiarem
private LruCache<String, Bitmap> memoryCache;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Uzyskanie maksymalnego dostępnego rozmiaru pamięci dla aplikacji (w KB)
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
// Używamy 1/8 dostępnej pamięci na cache
final int cacheSize = maxMemory / 8;
memoryCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
// Metoda do obliczania rozmiaru każdego elementu cache w jednostkach,
// tutaj - KB
return bitmap.getByteCount() / 1024;
}
};
}
// Dodanie elementu do cache
public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
if (getBitmapFromMemCache(key) == null) {
memoryCache.put(key, bitmap);
}
}
// Pobranie elementu z cache
public Bitmap getBitmapFromMemCache(String key) {
return memoryCache.get(key);
}