2012-04-13 10 views
6

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).

+1

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

risposta

2

Si è corretto, questo è un errore di battitura da parte mia.

Ho corretto il codice nell'albero dei sorgenti di Android. Grazie per questo feedback.

+0

Nessun problema. Ho notato che il codice originale è stato biforcuto/copiato su GitHub molte volte. Se non è troppo disturbo, forse un aggiornamento al post sul blog sarebbe saggio in modo che la comunità possa riconoscere il cambiamento. –