2012-04-13 9 views
6

He intentado aprender todo lo posible sobre el desarrollo de Android con un enfoque específico en el rendimiento, ya que muchas aplicaciones en Play Store hoy son lentas. He encontrado/me han dirigido a muchos artículos/videos.Posible ERROR en la clase Android ImageDownloader: sHardBitmapCache NO estática cuando debería ser?

Un artículo específico sobre la imagen de almacenamiento en caché está 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

el que Google parecía tener una versión de entrada y pone en sus clases de prueba 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 un defecto en el almacenamiento en caché. Utiliza una memoria caché blanda/dura que pone/obtiene cosas en la memoria caché porque el sistema Android restablece la memoria caché suave con bastante frecuencia.

Sin embargo, al observar el código, uno comienza a preguntarse si el caché duro se restablecería accidentalmente cada vez que se crea una instancia de la clase padre.

Primero el suave caché:

// 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); 

Ahora echar un vistazo al disco caché:

// 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; 
     } 
    }; 

El caché de disco es noestática, mientras que el caché blando es estático. Por lo tanto, la instancia de la memoria 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, estaba descargando la imagen cada vez y nunca la almacenaba en la memoria caché. Todo se hizo de forma asíncrona, pero aún golpeando la red cada vez. I verificado esto al poner una declaración Log.d() dentro de mi método que llega a la web y ver cuándo y con qué frecuencia se llamó.

Agregar la palabra clave estática solucionó el problema y mi aplicación es mucho más eficiente.

No estoy seguro de por qué este es el caso, ya que hay sólo una instancia de la clase ImageDownloader en mi adaptador como se muestra en el ejemplo:

private final ImageDownloader imageDownloader = new ImageDownloader(); 

LA PREGUNTA

Con todo lo dicho, ¿alguien más ha experimentado esto? O soy una combinación de loco/mal de alguna manera. No soy un experto en Java/Android/JVM/Dalvik/WeakReference/SoftReference, pero parece que algo está mal. No sé por qué sHardBitmapCache no se hizo estático, pero cuando hice el cambio mi aplicación dejó de llegar a la web tanto (ahorrando en costos de datos/drenaje de la batería/mejoras de rendimiento).

+1

sólo le he dado un breve vistazo al código, pero parece que estás en lo correcto - Sospecho sHardBitmapCache estaba destinado a ser estática, especialmente teniendo en cuenta que está nombrando. – JesusFreke

Respuesta

2

Tiene razón, este es un error tipográfico de mi parte.

He reparado el código en el árbol fuente de Android. Gracias por este comentario.

+0

No hay problema. Noté que el código original fue bifurcado/copiado en GitHub muchas veces. Si no es mucha molestia, tal vez una actualización de la entrada del blog sería prudente que la comunidad pueda reconocer el cambio. –

Cuestiones relacionadas