144 Stimmen

Android Bild-Caching

Wie kann ich Bilder in den Cache stellen, nachdem sie aus dem Internet heruntergeladen wurden?

13voto

esilver Punkte 26370

Ich würde in Erwägung ziehen, den Bild-Cache von droidfu zu verwenden. Er implementiert sowohl einen speicherinternen als auch einen festplattenbasierten Bildcache. Sie erhalten auch eine WebImageView, die die Vorteile der ImageCache-Bibliothek nutzt.

Hier ist die vollständige Beschreibung von droidfu und WebImageView: http://brainflush.wordpress.com/2009/11/23/droid-fu-part-2-webimageview-and-webgalleryadapter/

9voto

2cupsOfTech Punkte 5723

Ich habe SoftReferences ausprobiert, aber sie werden in Android zu aggressiv eingesetzt, so dass es keinen Sinn macht, sie zu verwenden.

9voto

EZFrag Punkte 317

Wie Thunder Rabbit vorgeschlagen hat, ist ImageDownloader das beste Programm für diese Aufgabe. Ich habe auch eine leichte Variation der Klasse gefunden bei:

http://theandroidcoder.com/utilities/Android-image-download-and-caching/

Der Hauptunterschied zwischen den beiden besteht darin, dass der ImageDownloader das Android-Zwischenspeichersystem verwendet, während der modifizierte ImageDownloader den internen und externen Speicher als Zwischenspeicher nutzt und die zwischengespeicherten Bilder auf unbestimmte Zeit oder so lange behält, bis der Benutzer sie manuell entfernt. Der Autor erwähnt auch die Kompatibilität mit Android 2.1.

7voto

Peter Pascale Punkte 1498

Das ist ein guter Fang von Joe. Das obige Codebeispiel hat zwei Probleme - erstens - das Antwortobjekt ist keine Instanz von Bitmap (wenn meine URL auf ein jpg verweist, wie http: \website.com\image.jpg ist eine

org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl$LimitedInputStream).

Zweitens, wie Joe betont, erfolgt keine Zwischenspeicherung, ohne dass ein Antwort-Cache konfiguriert wird. Android-Entwickler sind links, um ihre eigenen Cache rollen. Hier ist ein Beispiel dafür, aber es nur Caches im Speicher, die wirklich nicht die vollständige Lösung ist.

http://codebycoffee.com/2010/06/29/using-responsecache-in-an-Android-app/

Die URLConnection-Caching-API wird hier beschrieben:

http://download.oracle.com/javase/6/docs/technotes/guides/net/http-cache.html

Ich denke immer noch, dass es eine gute Lösung ist, diesen Weg zu gehen - aber man muss immer noch einen Cache schreiben. Klingt nach Spaß, aber ich würde lieber Funktionen schreiben.

7voto

shalafi Punkte 3893

Es gibt einen speziellen Eintrag im offiziellen Trainingsbereich von Android zu diesem Thema: http://developer.Android.com/training/displaying-bitmaps/cache-bitmap.html

Der Abschnitt ist recht neu, er war noch nicht vorhanden, als die Frage gestellt wurde.

Die vorgeschlagene Lösung ist die Verwendung eines LruCache. Diese Klasse wurde in Honeycomb eingeführt, ist aber auch in der Kompatibilitätsbibliothek enthalten.

Sie können einen LruCache initialisieren, indem Sie die maximale Anzahl von Einträgen festlegen. Der LruCache sortiert sie dann automatisch nach Ihren Wünschen und löscht die weniger verwendeten Einträge, wenn Sie das Limit überschreiten. Ansonsten wird er wie eine normale Karte verwendet.

Der Beispielcode von der offiziellen Seite:

private LruCache mMemoryCache;

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    // Get memory class of this device, exceeding this amount will throw an
    // OutOfMemory exception.
    final int memClass = ((ActivityManager) context.getSystemService(
            Context.ACTIVITY_SERVICE)).getMemoryClass();

    // Use 1/8th of the available memory for this memory cache.
    final int cacheSize = 1024 * 1024 * memClass / 8;

    mMemoryCache = new LruCache(cacheSize) {
        @Override
        protected int sizeOf(String key, Bitmap bitmap) {
            // The cache size will be measured in bytes rather than number of items.
            return bitmap.getByteCount();
        }
    };
    ...
}

public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
    if (getBitmapFromMemCache(key) == null) {
        mMemoryCache.put(key, bitmap);
    }
}

public Bitmap getBitmapFromMemCache(String key) {
    return mMemoryCache.get(key);
}

Früher war SoftReferences eine gute Alternative, aber jetzt nicht mehr, wie auf der offiziellen Seite zu lesen ist:

Hinweis: In der Vergangenheit war eine beliebte Speichercache-Implementierung ein SoftReference- oder WeakReference-Bitmap-Cache, der jedoch nicht empfohlen. Ab Android 2.3 (API Level 9) ist der Garbage Collector Garbage Collector aggressiver mit dem Sammeln von Soft-/Wak-Referenzen was sie ziemlich ineffektiv macht. Darüber hinaus wurden vor Android 3.0 (API Level 11) wurden die Hintergrunddaten einer Bitmap im nativen Speicher gespeichert Speicher gespeichert, der nicht auf vorhersehbare Weise freigegeben wird, was möglicherweise was dazu führen kann, dass eine Anwendung kurzzeitig ihre Speichergrenzen überschreitet und abstürzt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X