Sobes.tech
Middle

Ar žinai, kaip veikia talpyklos kortelė?

sobes.tech AI

Atsakymas iš AI

Memory Cache (Atminties talpykla) Android — tai mechanizmas, skirtas duomenų saugojimui į įrenginio operatyvinę atmintį, siekiant užtikrinti greitą prieigą. Ji grindžiama asociatyviosios talpyklos principais.

Kaip veikia:

  1. Duomenų užklausa: Kai programa prašo duomenų, kurie gali būti įkeliami į talpyklą (pavyzdžiui, vaizdas iš tinklo arba sudėtingos operacijos rezultatas), ji pirmiausia patikrina talpyklą.
  2. Paieška talpykloje: Jei duomenys rasti talpykloje (t. y. užklausos raktas atitinka talpyklos raktą), jie nedelsiant grąžinami, išvengiant lėtų įvesties-išvesties operacijų arba skaičiavimų. Tai vadinama "cache hit".
  3. Talpyklos praleidimas (Cache Miss): Jei duomenys nerandami talpykloje ("cache miss"), programa juos gauna iš pirminio šaltinio (tinklas, duomenų bazė ir kt.).
  4. Įdėjimas į talpyklą: Po gavimo duomenys įdedami į talpyklą būsimoms užklausoms su tuo pačiu raktu.
  5. Išstūmimas (Cache Eviction): Talpykla turi ribotą dydį. Kai ji užpildoma, seni arba mažiau naudojami elementai išstumiami, kad atlaisvintų vietos naujiems. Populiarūs išstūmimo algoritmai — LRU (Mažiausiai neseniai naudotas) ir LFU (Mažiausiai dažnai naudotas).

Pavyzdys Android'e naudojant LruCache:

// Sukurti `LruCache` su maksimaliu dydžiu
private LruCache<String, Bitmap> memoryCache;

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

    // Gauti maksimalią prieinamą atminties dydį (KB)
    final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);

    // Naudoti 1/8 prieinamos atminties cache
    final int cacheSize = maxMemory / 8;

    memoryCache = new LruCache<String, Bitmap>(cacheSize) {
        @Override
        protected int sizeOf(String key, Bitmap bitmap) {
            // Metodas, skaičiuojantis kiekvieno elemento dydį talpykloje,
            // atsižvelgiant į talpyklos dydį (čia — KB)
            return bitmap.getByteCount() / 1024;
        }
    };
}

// Elemento pridėjimas į talpyklą
public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
    if (getBitmapFromMemCache(key) == null) {
        memoryCache.put(key, bitmap);
    }
}

// Elemento gavimas iš talpyklos
public Bitmap getBitmapFromMemCache(String key) {
    return memoryCache.get(key);
}