La classe LruCache per gestire una cache di oggetti bitmap

L’uso intensivo di molte immagini in un’app può creare difficoltà sia alla responsività sia alla memoria, evidenziati da avvisi come ANR (Application Not Responding) o errori come OutOfMemoryError.

Considera un’app che mostra immagini in una lista utilizzando ListView, GridView o RecyclerView, per una migliore responsività dell’app tutte le immagini dovrebbero essere caricate in un array in memoria ma questo potrebbe portare a un errore perchè esiste un limite alla memoria che un app può usare, spesso nell’intervallo 16MB – 48MB.
L’alternativa è quella di salvare le immagini su file o in un database sqlite del dispositivo e caricare in memoria solo quelle correntemente mostrate all’utente ma la lettura da una memoria fisica ha dei tempi che l’utente può percepire e questo renderebbe l’app lenta o anche potrebbe portare a un ANR, inoltre la stessa immagine può essere caricata più volte potendo scorrere la lista su e giù.
La classe LruCache permette di salvare in una cache le immagini che quindi possono essere caricate una volta sola, è un buon compresso fra responsività e uso della memoria.

LruCache fa parte del Support Pack che può essere importato usando Gradle:

Crea la classe BitmapArray, un wrapper per un oggetto LruCache che in questo esempio usa come generics un Long e una Bitmap; Long è la chiave per accedere a Bitmap ed è possibile sostituirla anche con altri oggetti come Integer o String.

PERC è un valore compreso fra 0 e 1 e fissa la percentuale di memoria riservata alla cache, nell’esempio è il 30%.
I metodi get e put sono i metodi getter e setter per gestire le immagini nella cache, ogni volta che sono chiamati l’immagine corrispondente è collocata in testa alla coda della cache, nel caso in cui si cercasse di inserire una immagine con cache già piena le immagini alla fine della coda della cache sono rilasciate.

Nella classe adapter che gestisce la lista delle immagini tu probabilmente dovrai scrivere codice simile a questo:

Referenze:
LruCache
Caching Bitmaps
Manage Memory on Android 3.0 and Higher

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.