Sobes.tech
Middle

Víš, jak funguje cache karta?

sobes.tech AI

Odpověď od AI

Paměťová cache (Memory Cache) v Androidu je mechanismus pro ukládání dat do operační paměti zařízení pro rychlý přístup. Je založena na principech asociativní cache.

Jak funguje:

  1. Požadavek na data: Při požadavku na data, která mohou být uložena v cache (například obrázek ze sítě nebo výsledek složité operace), aplikace nejdříve zkontroluje cache.
  2. Hledání v cache: Pokud jsou data nalezena v cache (tj. klíč požadavku odpovídá klíči v cache), jsou ihned vrácena, čímž se vyhýbá pomalým operacím vstupu/výstupu nebo výpočtům. To se nazývá "cache hit".
  3. Cache miss: Pokud data v cache nenajdou ("cache miss"), aplikace je získá z původního zdroje (síť, databáze atd.).
  4. Uložení do cache: Po získání dat jsou uložena do cache pro budoucí požadavky se stejným klíčem.
  5. Vyvlastnění (Cache Eviction): Cache má omezenou velikost. Když je plná, staré nebo méně používané prvky jsou odstraněny, aby se uvolnilo místo pro nové. Časté algoritmy vyvlastnění zahrnují LRU (Least Recently Used) a LFU (Least Frequently Used).

Příklad implementace v Androidu s použitím LruCache:

// Vytvoření LruCache s maximální velikostí
private LruCache<String, Bitmap> memoryCache;

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

    // Získání maximální dostupné velikosti paměti pro aplikaci (v KB)
    final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);

    // Použití 1/8 dostupné paměti pro cache
    final int cacheSize = maxMemory / 8;

    memoryCache = new LruCache<String, Bitmap>(cacheSize) {
        @Override
        protected int sizeOf(String key, Bitmap bitmap) {
            // Metoda pro výpočet velikosti každého prvku cache v jednotkách,
            // zde - KB
            return bitmap.getByteCount() / 1024;
        }
    };
}

// Přidání prvku do cache
public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
    if (getBitmapFromMemCache(key) == null) {
        memoryCache.put(key, bitmap);
    }
}

// Získání prvku z cache
public Bitmap getBitmapFromMemCache(String key) {
    return memoryCache.get(key);
}