Wie kann ich Bilder in den Cache stellen, nachdem sie aus dem Internet heruntergeladen wurden?
Antworten
Zu viele Anzeigen?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/
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.
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.
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.