Posible error en la clase ImageDownloader de Android: sHardBitmapCache ¿NO estático cuando debería estarlo? [cerrado]
He estado tratando de aprender todo lo posible sobre el desarrollo de Android con un enfoque específico en el rendimiento, ya que muchas de las aplicaciones de Play Store hoy en día son lentas. He encontrado / sido dirigido a muchos artículos / videos.
Un artículo específico sobre el almacenamiento en caché de imágenes se encuentra en:http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html
El autor tiene código disponible en:http://code.google.com/p/android-imagedownloader/source/browse/trunk/src/com/example/android/imagedownloader/ImageDownloader.java
Que Google parecía tomar una versión de y poner en sus clases de muestra en:http://developer.android.com/resources/samples/XmlAdapters/src/com/example/android/xmladapters/ImageDownloader.html
En general, es sólido, excepto por lo que creo que es una falla en el almacenamiento en caché. Utiliza un caché suave / duro que pone / pone cosas en el caché duro porque el sistema de Android restablece el caché suave con bastante frecuencia.
Sin embargo, mirando el código, uno comienza a preguntarse si la caché de disco duro se restablecería accidentalmente cada vez que se crea una instancia de la clase padre.
Primero el caché suave:
<code> // 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); </code>
Ahora eche un vistazo a la caché de disco duro:
<code> // 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; } }; </code>
loscaché duro esno estático, mientras que el caché suave es estático. Así que la instancia de la caché dura y, por lo tanto, los elementos se borran con la vida de la instancia de la clase.
La razón por la que creo que esto es cierto es que noté que mi aplicación con un ListView / ImageView, descargaba la imagen cada vez y nunca la guardaba en caché. Todo se hizo de forma asíncrona, pero todavía golpea la red cada vez. yoverificado esto poniendo unLog.d()
declaración dentro de mi método que llega a la web y ve cuándo y con qué frecuencia se llama.
Agregar la palabra clave estática solucionó el problema y mi aplicación es mucho más eficaz.
No estoy seguro de por qué este es el caso, ya que solo hay una instancia de la clase ImageDownloader en mi adaptador, como se muestra en el ejemplo:
<code>private final ImageDownloader imageDownloader = new ImageDownloader(); </code>
LA PREGUNTA
Con todo lo dicho, ¿alguien más ha experimentado esto? O soy una combinación de locura / mal de alguna manera. No soy un experto en Java / Android / JVM / Dalvik / WeakReference / SoftReference, pero algo parece un poco raro. No se porquesHardBitmapCache
no se hizo estática, pero cuando hice el cambio, mi aplicación dejó de golpear la web tanto(ahorro en costos de datos / drenaje de la batería / mejoras de rendimiento).