Posible BUG en Android Clase ImageDownloader: sHardBitmapCache NO estática cuando debería ser?

He estado tratando de aprender lo más posible sobre el desarrollo de Android con un enfoque específico en el rendimiento ya que muchas aplicaciones en la tienda de Play hoy son lentas. He encontrado / dirigido a muchos artículos / videos.

Un artículo específico sobre el almacenamiento en caché de imágenes está en: http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html

El autor tiene el código disponible en: http://code.google.com/p/android-imagedownloader/source/browse/trunk/src/com/example/android/imagedownloader/ImageDownloader.java

Qué Google parecía tomar una versión de en y poner en sus clases de la 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é blando / duro que pone / obtiene cosas en el caché duro porque el sistema de Android restablece la caché suave a menudo.

Mirando el código sin embargo, uno comienza a preguntarse si la memoria caché dura conseguiría puesta a cero accidentalmente cada vez que la clase del padre se instancia.

Primero la caché suave:

// 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 eche un vistazo al caché duro:

  // 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é duro no es estático , mientras que el caché suave es estático. Por lo tanto, la instancia de caché duro 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 me di cuenta de mi aplicación con un ListView / ImageView, estaba descargando la imagen cada vez y nunca caché. Todo estaba hecho asincrónicamente, pero todavía golpeaba la red cada vez. Log.d() esto poniendo una declaración de Log.d() dentro de mi método que golpea la tela y viendo cuando / cómo con frecuencia fue llamada.

Agregando la palabra clave estática solucionado el problema y mi aplicación es mucho más performant.

No estoy seguro de por qué este es el caso, ya que sólo hay 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 / equivocado de alguna manera. No soy Java / Android / JVM / Dalvik / WeakReference / SoftReference experto, pero algo parece un poco apagado. No sé por qué sHardBitmapCache no se hizo estática, pero cuando hice el cambio de mi aplicación dejó de golpear la web tanto (ahorro en los costos de datos / drenaje de la batería / mejoras de rendimiento) .

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

He arreglado el código en el árbol de origen de Android. Gracias por esta retroalimentación.

  • Map.clear () vs nuevo Mapa: ¿Cuál será mejor?
  • ¿Cómo configurar el desplazamiento perfomance para webview?
  • ¿Qué significa realmente el estado del hilo de Java?
  • Eficiencia de findViewById
  • Simula la memoria baja en el dispositivo real de Android
  • Qué orden de diseños anidados es más eficiente en Android
  • Cómo compartir datos con Android Volley
  • ¿Cuál es el mejor lenguaje para la programación gráfica en tiempo real en Android?
  • Android: rendimiento de gson
  • ¿Cuál es la causa de los picos de rendimiento periódicos que se ven al hacer el procesamiento de matriz de computación caro en el Nexus 4?
  • Cómo comprobar si existe una clave en Json Object y obtener su valor
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.