Sobes.tech
Middle

Weet je hoe de cache-kaart werkt?

sobes.tech AI

Antwoord van AI

De geheugencache (Memory Cache) in Android is een mechanisme voor het opslaan van gegevens in het RAM-geheugen van het apparaat voor snelle toegang. Het is gebaseerd op de principes van de associatieve cache.

Hoe het werkt:

  1. Gegevensaanvraag: Wanneer gegevens worden opgevraagd die in de cache kunnen worden opgeslagen (bijvoorbeeld een afbeelding uit het netwerk of het resultaat van een complexe operatie), controleert de app eerst de cache.
  2. Zoeken in de cache: Als de gegevens in de cache worden gevonden (d.w.z. dat de sleutel van de aanvraag overeenkomt met de sleutel in de cache), worden ze onmiddellijk geretourneerd, waardoor langzame invoer-/uitvoerbewerkingen of berekeningen worden vermeden. Dit wordt "cache hit" genoemd.
  3. Cache miss: Als de gegevens niet in de cache worden gevonden ("cache miss"), haalt de app ze uit de oorspronkelijke bron (netwerk, database, etc.).
  4. In de cache plaatsen: Na het verkrijgen van de gegevens worden ze in de cache geplaatst voor toekomstige aanvragen met dezelfde sleutel.
  5. EVICTIE (Cache Eviction): De cache heeft een beperkte grootte. Wanneer deze vol is, worden oude of minder gebruikte elementen verwijderd om ruimte te maken voor nieuwe. Veelgebruikte algoritmen voor verwijdering zijn LRU (Least Recently Used) en LFU (Least Frequently Used).

Voorbeeld van implementatie in Android met LruCache:

// Aanmaken van een LruCache met maximale grootte
private LruCache<String, Bitmap> memoryCache;

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

    // Maximaal beschikbare geheugen voor de app verkrijgen (in KB)
    final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);

    // Gebruik 1/8 van het beschikbare geheugen voor de cache
    final int cacheSize = maxMemory / 8;

    memoryCache = new LruCache<String, Bitmap>(cacheSize) {
        @Override
        protected int sizeOf(String key, Bitmap bitmap) {
            // Methode om de grootte van elk cache-item te berekenen in eenheden,
            // hier - KB
            return bitmap.getByteCount() / 1024;
        }
    };
}

// Element toevoegen aan de cache
public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
    if (getBitmapFromMemCache(key) == null) {
        memoryCache.put(key, bitmap);
    }
}

// Element uit de cache halen
public Bitmap getBitmapFromMemCache(String key) {
    return memoryCache.get(key);
}