2012-01-20 15 views
12

Fino ad ora sto utilizzando una cache SoftReference per immagini in Android. Questa cache è usata per le immagini mostrate in ListViews e dovrebbe aiutare a conservare le immagini degli oggetti in memoria che non sono mostrati sullo schermo, se rimane abbastanza memoria.Come implementare un in Memory Image Cache in Android?

Il problema con questo è che le SoftReferenze vengono raccolte inutilmente quasi nello stesso momento in cui viene rilasciato l'ultimo riferimento. Il risultato è che un'immagine che viene rimossa dallo schermo è raccolta di dati inutili in quel momento e se l'utente scorre indietro fino a questa voce in ListView l'immagine viene ricaricata dalla memoria interna del telefono risultando in un processo di caricamento lento e complesso, risultante in frequenti ridisegni della lista e cattive prestazioni generali.

Il bug request per il comportamento di riferimento software indica che questo è il comportamento previsto e che è necessario utilizzare uno LRU-Cache per memorizzare nella cache questo tipo di elementi.

Conoscere la mia domanda. La cache della LRU occupa solo la quantità di memoria che gli è consentita. Ma se l'app ha bisogno di molta memoria, non libererà memoria. Come dovrei determinare quanta memoria posso permettere alla Cache di usare, e c'è un modo per ridurre la dimensione della cache se la situazione della memoria del telefono diventa stretta?

Al momento la cache dell'immagine viene salvata all'interno dell'applicazione come una sorta di archivio di immagini globale per tutte le attività. Ciò comporterebbe che la mia app usasse costantemente tutta la memoria della cache dell'immagine anche se le mie attività sono in background o distrutte.

risposta

3

Mantenere attivi i processi in background è un'ottimizzazione a livello di sistema operativo che consente di tornare rapidamente al processo. Il tuo processo rimarrà in vita solo fino a quando il sistema operativo può permettersi la memoria; quando quella memoria è necessaria per un'altra applicazione, il tuo processo verrà ucciso e le sue risorse saranno rilasciate.

Se si libera la cache ogni volta che si esegue lo sfondo del processo, tornare alla propria applicazione non sarebbe più veloce perché vedrebbe mancate le cache. Ciò sconfigge l'ottimizzazione keep-background-processes-alive di Android!

Dovresti semplicemente usare lo LruCache, che è anche incluso nello Android Support Package per le versioni precedenti ad Android 3.0 (Honeycomb).

+0

grazie per la risposta – Janusz

+0

Non riesco a vedere come usare LruCache risolverebbe il problema della memorizzazione nella cache delle immagini o di qualsiasi altro BLOB. Il problema è la sua dimensione fissa, di cui ogni voce contiene un forte riferimento all'oggetto memorizzato nella cache. Ciò non si ridimensiona con la memoria del dispositivo. – Matthias

+0

LruCache elimina le voci quando le dimensioni superano il limite impostato. È possibile sovrascrivere un metodo per aiutare LruCache a misurare le dimensioni di ciascuna voce. –

Problemi correlati