Ho cercato di imparare il più possibile sullo sviluppo di Android con particolare attenzione alle prestazioni poiché molte app nel Play Store oggi sono lente. Ho trovato/stato diretto a molti articoli/video.Possibile bug in Android ImageDownloader classe: sHardBitmapCache NON statico quando dovrebbe essere?
Uno specifico articolo sulla immagine caching e ': http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html
L'autore ha promozionali validi: http://code.google.com/p/android-imagedownloader/source/browse/trunk/src/com/example/android/imagedownloader/ImageDownloader.java
Quali Google sembrava prendere una versione di dentro e metterli nelle loro classi di esempio a: http://developer.android.com/resources/samples/XmlAdapters/src/com/example/android/xmladapters/ImageDownloader.html
In generale è solido, tranne che per quello che penso sia un difetto nella cache. Usa una cache soft/hard che mette/mette le cose nella cache dura perché il sistema Android reimposta la cache soft abbastanza spesso.
Tuttavia, osservando il codice, si inizia a chiedersi se la cache hardware si ripristini accidentalmente ogni volta che viene creata un'istanza della classe padre.
Prima la cache morbido:
// Soft cache for bitmaps kicked out of hard cache
private final static ConcurrentHashMap<String, SoftReference<Bitmap>> sSoftBitmapCache =
new ConcurrentHashMap<String, SoftReference<Bitmap>>(HARD_CACHE_CAPACITY/2);
Ora date un'occhiata alla cache del disco:
// Hard cache, with a fixed maximum capacity and a life duration
private final HashMap<String, Bitmap> sHardBitmapCache =
new LinkedHashMap<String, Bitmap>(HARD_CACHE_CAPACITY/2, 0.75f, true) {
@Override
protected boolean removeEldestEntry(LinkedHashMap.Entry<String, Bitmap> eldest) {
if (size() > HARD_CACHE_CAPACITY) {
// Entries push-out of hard reference cache are transferred to soft reference cache
sSoftBitmapCache.put(eldest.getKey(), new SoftReference<Bitmap>(eldest.getValue()));
return true;
} else
return false;
}
};
Il duro della cache è nonstatica, mentre la cache molle è statico. Quindi l'istanza della cache dura e quindi gli elementi vengono cancellati con la durata dell'istanza della classe.
Il motivo per cui penso sia vero è che ho notato che la mia applicazione con ListView/ImageView, scaricava sempre l'immagine e non la memorizzava mai. Tutto è stato fatto in modo asincrono, ma ogni volta colpisce ancora la rete. I verificato questo mettendo una dichiarazione Log.d()
all'interno del mio metodo che colpisce il web e vedere quando/con che frequenza è stato chiamato.
L'aggiunta della parola chiave statica ha risolto il problema e la mia applicazione è molto più performante.
io non sono sicuro perché questo è il caso in quanto v'è una sola istanza della classe ImageDownloader nel mio adattatore come mostrato nell'esempio:
private final ImageDownloader imageDownloader = new ImageDownloader();
LA QUESTIONE
Con tutto ciò detto, qualcun altro ha provato questo ??? O sono una combinazione di pazzo/sbagliato in qualche modo. Non sono un esperto Java/Android/JVM/Dalvik/WeakReference/SoftReference, ma qualcosa sembra un po 'fuori. Non so perché sHardBitmapCache
non è stato reso statico, ma quando ho apportato la modifica la mia applicazione ha smesso di colpire il web così tanto (risparmio sui costi dei dati/drenaggio della batteria/miglioramenti delle prestazioni).
Ho dato solo una breve occhiata al codice, ma sembra che tu abbia ragione - sospetto che sHardBitmapCache sia stato pensato per essere statico, soprattutto dato che è il nome. – JesusFreke