Middle
Vai tu zini, kā darbojas keškarte?
sobes.tech AI
Atbilde no AI
Memory Cache (Atmiņas kešatmiņa) Android — tas ir mehānisms datu glabāšanai ierīces operatīvajā atmiņā, lai nodrošinātu ātru piekļuvi. Tā balstās uz asociatīvās kešatmiņas principiem.
Kā tas darbojas:
- Datu pieprasījums: Kad lietotne pieprasa datus, kas var tikt kešoti (piemēram, attēls no tīkla vai sarežģītas operācijas rezultāts), tā vispirms pārbauda kešatmiņu.
- Meklēšana kešatmiņā: Ja dati ir atrasti kešatmiņā (t. i., pieprasījuma atslēga atbilst kešatmiņas atslēgai), tie tiek nekavējoties atgriezti, izvairoties no lēnām ievades-izvades operācijām vai aprēķiniem. To sauc par "cache hit".
- Kešatmiņas trūkums (Cache Miss): Ja dati nav atrasti kešatmiņā ("cache miss"), lietotne tos iegūst no oriģinālā avota (tīkls, datu bāze utt.).
- Datu ievietošana kešatmiņā: Pēc iegūšanas dati tiek ievietoti kešatmiņā nākotnes pieprasījumiem ar to pašu atslēgu.
- Izslēgšana (Cache Eviction): Kešatmiņai ir ierobežota izmērs. Kad tā ir pilna, vecie vai mazāk lietotie elementi tiek izslēgti, lai atbrīvotu vietu jauniem. Populāri izslēgšanas algoritmi ir — LRU (Mazāk lietots nesen) un LFU (Mazāk bieži lietots).
Piemērs Android ar LruCache:
// Maksimālā izmēra `LruCache` izveide
private LruCache<String, Bitmap> memoryCache;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Maksimālā pieejamā atmiņas izmēra iegūšana (KB)
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
// Izmantojam 1/8 no pieejamās atmiņas kešam
final int cacheSize = maxMemory / 8;
memoryCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
// Metode, kas aprēķina katra elementa izmēru kešā,
// atbilstoši keša izmēram (šeit — KB)
return bitmap.getByteCount() / 1024;
}
};
}
// Elementa pievienošana kešam
public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
if (getBitmapFromMemCache(key) == null) {
memoryCache.put(key, bitmap);
}
}
// Elementa iegūšana no kešatmiņas
public Bitmap getBitmapFromMemCache(String key) {
return memoryCache.get(key);
}