2012-04-13 8 views
6

Ich habe versucht, so viel wie möglich über Android-Entwicklung mit besonderem Fokus auf Leistung zu lernen, da viele Apps im Play Store heute träge sind. Ich habe viele Artikel/Videos gefunden.Mögliche Fehler in Android ImageDownloader-Klasse: sHardBitmapCache nicht statisch, wenn es sein sollte?

Ein spezifischer Artikel über Bildcachierens ist: http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html

hat der Autor Code verfügbar unter: http://code.google.com/p/android-imagedownloader/source/browse/trunk/src/com/example/android/imagedownloader/ImageDownloader.java

Welche Google eine Version in und in ihre Probe Klassen an zu nehmen schien: http://developer.android.com/resources/samples/XmlAdapters/src/com/example/android/xmladapters/ImageDownloader.html

Im Allgemeinen ist es solide, außer für was ich denke, ist ein Fehler in der Zwischenspeicherung. Es verwendet einen Soft-/Hard-Cache, der Dinge in den Hard-Cache versetzt, weil das Android-System den Soft-Cache häufig zurücksetzt.

Wenn man sich den Code anschaut, beginnt man sich zu fragen, ob der Hard-Cache bei jeder Instantiierung der Elternklasse versehentlich zurückgesetzt wird.

Zuerst wird die weichen Cache:

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

nun einen Blick auf der harten Cache nehmen:

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

Die hart Cache ist nichtstatische, während die weichen Cache statisch. Daher wird die Hard-Cache-Instanz und damit die Elemente mit der Lebensdauer der Instanz der Klasse gelöscht.

Der Grund, warum ich das für wahr halte, ist, dass ich meine Anwendung mit einem ListView/ImageView bemerkt habe, das Bild jedes Mal heruntergeladen und nie zwischengespeichert habe. Es wurde alles asynchron gemacht, aber immer noch ins Netz geschossen. Ich verifiziert dies, indem Sie eine Log.d() Anweisung in meine Methode, die das Web und sehen, wann/wie oft es aufgerufen wurde.

Hinzufügen der statischen Schlüsselwort behoben das Problem und meine Anwendung ist viel leistungsfähiger.

Ich bin nicht sicher, warum dies der Fall ist, da es nur eine Instanz der ImageDownloader Klasse in meinem Adapter ist wie in dem Beispiel gezeigt:

private final ImageDownloader imageDownloader = new ImageDownloader(); 

DIE FRAGE

Mit all das gesagt, hat jemand anderes dies erlebt ??? Oder bin ich irgendwie eine Kombination aus verrückt/falsch? Ich bin kein Java-/Android-/JVM-/Dalvik-/WeakReference-/SoftReference-Experte, aber etwas scheint ein bisschen daneben zu liegen. Ich weiß nicht, warum sHardBitmapCache nicht statisch gemacht wurde, aber als ich die Änderung machte, hörte meine Anwendung auf, so viel ins Netz zu schlagen (Einsparung von Datenkosten/Batterieentwässerung/Leistungsverbesserungen).

+1

Ich habe nur einen kurzen Blick auf den Code, aber es scheint, als ob Sie richtig sind - ich vermute, sHardBitmapCache sollte statisch sein, vor allem angesichts seiner Benennung. – JesusFreke

Antwort

2

Sie haben Recht, das ist ein Tippfehler meinerseits.

Ich habe den Code in der Android-Source-Struktur behoben. Danke für dieses Feedback.

+0

Kein Problem. Ich bemerkte, dass der ursprüngliche Code viele Male auf GitHub kopiert/kopiert wurde. Wenn es nicht zu viel Mühe macht, wäre vielleicht eine Aktualisierung des Blogposts sinnvoll, damit die Community die Änderung erkennen kann. –