Middle
Ξέρεις πώς λειτουργεί η κάρτα cache;
sobes.tech AI
Απάντηση από AI
Η μνήμη cache (Memory Cache) στο Android είναι ένας μηχανισμός αποθήκευσης δεδομένων στη μνήμη RAM της συσκευής για γρήγορη πρόσβαση. Βασίζεται στις αρχές της συσχετιστικής cache.
Πώς λειτουργεί:
- Αίτημα δεδομένων: Όταν ζητούνται δεδομένα που μπορούν να αποθηκευτούν στην cache (π.χ. μια εικόνα από το δίκτυο ή το αποτέλεσμα μιας πολύπλοκης λειτουργίας), η εφαρμογή ελέγχει πρώτα την cache.
- Αναζήτηση στην cache: Αν τα δεδομένα βρεθούν στην cache (δηλαδή, το κλειδί του αιτήματος ταιριάζει με το κλειδί στην cache), επιστρέφονται άμεσα, αποφεύγοντας αργές λειτουργίες εισόδου/εξόδου ή υπολογισμούς. Αυτό ονομάζεται "cache hit".
- Cache miss: Αν τα δεδομένα δεν βρεθούν στην cache ("cache miss"), η εφαρμογή τα λαμβάνει από την αρχική πηγή (δίκτυο, βάση δεδομένων κ.λπ.).
- Τοποθέτηση στην cache: Μετά την απόκτησή τους, τοποθετούνται στην cache για μελλοντικά αιτήματα με το ίδιο κλειδί.
- Εκκαθάριση (Cache Eviction): Η cache έχει περιορισμένο μέγεθος. Όταν γεμίζει, τα παλιά ή λιγότερο χρησιμοποιούμενα στοιχεία απομακρύνονται για να ελευθερωθεί χώρος για νέα. Δημοφιλείς αλγόριθμοι εκκαθάρισης είναι LRU (Least Recently Used) και LFU (Least Frequently Used).
Παράδειγμα υλοποίησης σε Android με LruCache:
// Δημιουργία LruCache με μέγιστο μέγεθος
private LruCache<String, Bitmap> memoryCache;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Απόκτηση μέγιστου διαθέσιμου μεγέθους μνήμης για την εφαρμογή (σε KB)
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
// Χρησιμοποιούμε 1/8 της διαθέσιμης μνήμης για την cache
final int cacheSize = maxMemory / 8;
memoryCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
// Μέθοδος για τον υπολογισμό του μεγέθους κάθε στοιχείου της cache σε μονάδες,
// εδώ - KB
return bitmap.getByteCount() / 1024;
}
};
}
// Προσθήκη στοιχείου στην cache
public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
if (getBitmapFromMemCache(key) == null) {
memoryCache.put(key, bitmap);
}
}
// Λήψη στοιχείου από την cache
public Bitmap getBitmapFromMemCache(String key) {
return memoryCache.get(key);
}