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

Respuestas a la pregunta(1)

Su respuesta a la pregunta