webentwicklung-frage-antwort-db.com.de

Lokale Bild-Caching-Lösung für Android: Square Picasso, Universal Image Loader, Glide, Fresco?

Ich suche eine asynchrone Bibliothek zum Laden und Zwischenspeichern von Bildern in Android. Ich wollte Picasso verwenden, fand jedoch, dass Universal Image Loader auf GitHub populärer ist. Kennt jemand diese beiden Bibliotheken? Eine Zusammenfassung der Vor- und Nachteile wäre großartig.

(Alle meine Bilder befinden sich lokal auf der Festplatte, daher brauche ich kein Netzwerk, daher glaube ich nicht, dass Volley passt.)

88
xy uber.com

Update September 2018: Nach einigen Jahren brauchte ich fast dasselbe für eine lokale Bild-Caching-Lösung. Dieses Mal war UIL nicht in der aktiven Entwicklung. Ich habe die populären Bibliotheken verglichen und das Fazit ist ziemlich einfach: benutze einfach Glide. Es ist viel leistungsfähiger und konfigurierbar. Vor Jahren musste ich an der UIL Änderungen vornehmen. Glide unterstützt alle meine Anwendungsfälle in Bezug auf die Caching-Strategie und das Caching in mehreren Auflösungsebenen mit benutzerdefinierten Schlüsseln. Benutze einfach Glide!

Koushik Duttas Vergleich dient hauptsächlich dem Geschwindigkeits-Benchmark. Sein Beitrag berührte nur sehr grundlegende Dinge und ist nicht spezifisch für lokale Bilder. Ich möchte meine Erfahrungen mit Picasso und UIL teilen, nachdem ich die Frage gestellt habe. Sowohl Picasso als auch UIL können lokale Bilder laden. Ich habe zuerst Picasso ausprobiert und war glücklich, aber später habe ich beschlossen, zu UIL zu wechseln, um weitere Anpassungsoptionen zu erhalten.

Picasso:

  • Picassos fließendes Interface ist Nizza. Aber wenn man mit "mit", "in", "laden" herumspringt, weiß man eigentlich nicht, was sich hinter den Kulissen verbirgt. Es ist verwirrend, was zurückkommt.

  • Mit Picasso können Sie die genaue Zielgröße festlegen. Dies ist nützlich, wenn Sie Probleme mit dem Arbeitsspeicher oder der Leistung haben. Sie können die Bildqualität gegen die Geschwindigkeit eintauschen.

  • Bilder werden mit der Größe im Schlüssel zwischengespeichert. Dies ist nützlich, wenn Sie Bilder mit unterschiedlichen Größen anzeigen.

  • Sie können die Größe des Speichercaches anpassen. Der Datenträgercache ist jedoch nur für http-Anforderungen vorgesehen. Wenn Sie bei lokalen Bildern Wert auf die Ladegeschwindigkeit legen, empfiehlt es sich, einen Miniatur-Festplatten-Cache zu haben, damit Sie nicht jedes Mal mehrere MB für ein Bild lesen müssen. Picasso verfügt nicht über diesen Mechanismus zum Ändern der Größe und Speichern von Miniaturansichten auf der Festplatte.

  • Picasso macht den Zugriff auf seine Cache-Instanz nicht verfügbar. (Wenn Sie Picasso zum ersten Mal konfigurieren, können Sie es in die Hand nehmen ...).

  • Manchmal möchten Sie das Bild asynchron in eine von einem Listener zurückgegebene Bitmap einlesen. Überraschenderweise hat Picasso das nicht. "fetch ()" gibt nichts zurück. "get ()" dient zum synchronen Lesen und "load ()" zum asynchronen Zeichnen einer Ansicht.

  • Picasso hat nur ein paar einfache Beispiele auf der Homepage, und Sie müssen das ungeordnete Javadoc durchlesen, um eine erweiterte Verwendung zu erhalten.

UIL:

  • UIL verwendet Builder zur Anpassung. Fast alles kann konfiguriert werden.

  • In UIL können Sie nicht die Größe angeben, die Sie in eine Ansicht laden möchten. Es werden einige Regeln verwendet, die auf der Größe der Ansicht basieren. Es ist nicht so flexibel wie Picasso. Ich habe keine Möglichkeit, ein Bild mit niedrigerer Auflösung zu laden, um den Speicherbedarf zu verringern. (Bearbeiten: Dieses Verhalten kann einfach geändert werden, indem im Quellcode ein ImageSize-Argument hinzugefügt und die Größenprüfung der Ansicht umgangen wird.)

  • UIL bietet einen anpassbaren CD-Cache, mit dem Sie die Miniaturansichten mit der angegebenen Größe zwischenspeichern können. Aber es ist nicht perfekt. Hier sind die Details . (Bearbeiten: Wenn Ihnen die Geschwindigkeit am Herzen liegt und Sie mehrere Ebenen für die Zwischenspeicherung von Miniaturansichten wünschen, wie in meinem Fall, können Sie den Quellcode ändern, den Festplatten-Cache "memoryKey" verwenden lassen und ihn auch größenabhängig machen.)

  • UIL speichert standardmäßig Bilder unterschiedlicher Größe im Speicher und kann in der Konfiguration deaktiviert werden.

  • UIL macht den Backup-Speicher und den Festplatten-Cache verfügbar, auf die Sie zugreifen können.

  • UIL bietet flexible Möglichkeiten, um eine Bitmap abzurufen oder in eine Ansicht zu laden.

  • UIL ist besser in der Dokumentation. UIL gibt die detaillierten Verwendungen auf der Github-Seite an und es gibt ein verlinktes Tutorial.

Ich schlage vor, mit Picasso zu beginnen. Wenn Sie mehr Kontrolle und Anpassung benötigen, entscheiden Sie sich für UIL.

80
xy uber.com

Wenn Sie this Post auf G + von Koush lesen, erhalten Sie klare Lösungen für Ihre Verwirrungen, ich habe die Zusammenfassung davon in diesem Android-Universal-Image-Loader ist der Gewinner für Ihre Anforderung!

  • Picasso hat die schönste Bild-API, wenn Sie ein Netzwerk verwenden!

  • rlImageViewHelper + AndroidAsync ist am schnellsten. Das Spielen mit diesen beiden anderen großartigen Bibliotheken hat jedoch deutlich gemacht, dass die Bild-API veraltet ist.

  • Volley ist glatt; Ich genieße wirklich ihre steckbaren Backend-Transporte,
    und kann dazu führen, dass AndroidAsync dort abgelegt wird. Die Anforderungspriorität
    und die Stornierungsverwaltung sind großartig (wenn Sie ein Netzwerk verwenden)

  • Android-Universal-Image-Loader ist die beliebteste Version
    zur Zeit. Sehr anpassbar.

Ziel dieses Projekts ist es, ein wiederverwendbares Instrument zum asynchronen Laden, Zwischenspeichern und Anzeigen von Bildern bereitzustellen. Es basiert ursprünglich auf Fedor Vlasovs Projekt und wurde seitdem grundlegend überarbeitet und verbessert.

Kommende Änderungen in der neuen UIL-Version (1.9.2):

Möglichkeit, ImageLoader aus dem UI-Thread aufzurufenNew Disk Cache API (flexibler). Neuer LruDiscCache basierend auf Jake Whartons DiskLruCache.

Angesichts all dieser Android-Universal-Image-Loader-Suiten Ihre Anforderung ( Laden der Bilder sind auf der Festplatte lokal)!

72
LOG_TAG

Ich möchte meine Erfahrungen mit diesen 3 Bibliotheken teilen: UIL, Picasso und Volley. Früher habe ich UIL verwendet, aber dann bin ich zu dem Schluss gekommen, dass ich es nicht wirklich empfehlen kann, und ich würde vorschlagen, stattdessen Volley oder Picasso zu verwenden, die beide von hochtalentierten Teams entwickelt wurden. UIL ist überhaupt nicht schlecht, aber es fehlt die Liebe zum Detail der beiden anderen Bibliotheken.

Ich fand, dass UIL mit der UI-Leistung weniger gut abschneidet. es neigt dazu, den UI-Thread mehr als Volley oder Picasso zu blockieren. Dies kann zum Teil auf die Tatsache zurückzuführen sein, dass UIL das Stapeln der Bildantworten nicht unterstützt, während Picasso und Volley dies standardmäßig tun.

Außerdem hat mir das Festplatten-Cache-System von UIL nicht gefallen. Während Sie zwischen verschiedenen Implementierungen wählen können, muss ich darauf hinweisen, dass es im Moment keine Möglichkeit gibt, den UIL-Festplatten-Cache sowohl nach Gesamtgröße als auch zu begrenzen nach Ablaufzeitpunkt der Entität. Volley und Picasso tun dies und verwenden standardmäßig die vom Server zurückgegebene Ablaufzeit, während UIL sie ignoriert.

Schließlich können Sie mit UIL eine globale Image Loader-Konfiguration festlegen, die die ausgewählten Implementierungen und Einstellungen des Festplatten- und Speichercaches sowie andere Details enthält. Diese Konfiguration wird jedoch überall in Ihrer App angewendet. Wenn Sie also mehr Flexibilität wie zwei separate Festplattencaches benötigen, ist UIL kein Problem. Mit Volley hingegen können Sie beliebig viele separate Image Loader mit jeweils eigener Konfiguration verwenden. Picasso verwendet standardmäßig eine globale Instanz, ermöglicht es Ihnen jedoch auch, separat konfigurierbare Instanzen zu erstellen.

Fazit: Picasso hat die beste API, verwendet jedoch den globalen HTTP-Festplatten-Cache, der von allen Instanzen von HttpURLConnection gemeinsam genutzt wird, was in einigen Fällen zu restriktiv sein kann. Volley bietet die beste Leistung und Modularität, ist jedoch weniger benutzerfreundlich und erfordert, dass Sie ein oder zwei eigene Module schreiben, damit es wie gewünscht funktioniert. Insgesamt würde ich beide gegen UIL empfehlen.

Bearbeiten (18.12.2014): Seit ich diese erste Antwort geschrieben habe, haben sich die Dinge geändert und ich hielt es für notwendig, sie zu verbessern:

Picasso 2.4 ist sogar noch konfigurierbarer als ältere Versionen. In Verbindung mit OkHttp (was sehr zu empfehlen ist) kann auch ein separater Festplatten-Cache für jede Instanz verwendet werden, sodass Sie wirklich keine Einschränkung in Bezug auf Ihre Möglichkeiten haben. Noch wichtiger ist, dass sich die Leistung von Picasso und OkHttp erheblich verbessert hat und meiner Meinung nach jetzt die schnellste Bildladelösung für Android ist. Bitte beachten Sie, dass ich in meinem Code immer .fit() in Kombination mit .centerCrop() oder .centerInside() verwende, um die Speichernutzung zu verringern und Bitmap-Größenänderungen im UI-Thread zu vermeiden. Picasso wird aktiv entwickelt und unterstützt und das ist sicherlich ein großes Plus.

Volley hat sich nicht so sehr verändert, aber ich habe in der Zwischenzeit zwei Probleme damit bemerkt:

  • Manchmal werden unter hoher Last einige Bilder nicht mehr geladen, weil der Festplatten-Cache beschädigt ist.
  • In NetworkImageView angezeigte Miniaturansichten (deren Skalierungstyp auf centerCrop eingestellt ist) sind im Vergleich zu den anderen Bibliotheken recht unscharf.

Aus diesen Gründen habe ich beschlossen, Volley nicht mehr zu benutzen.

UIL ist immer noch langsam (insbesondere der Festplatten-Cache) und die API ändert sich häufig.

Ich habe auch diese neue Bibliothek mit dem Namen Glide getestet, die mit einer Picasso-ähnlichen API optimierter sein soll als Picasso. Nach meiner persönlichen Erfahrung ist es bei Netzwerkanforderungen unter hoher Last sogar in Kombination mit OkHttp langsamer als Picasso und Volley. Schlimmer noch, es gab ein paar Abstürze mit meinen Apps unter Lollipop, als ich eine Aktivität verließ. Es hat immer noch 2 Vorteile gegenüber seinen Konkurrenten:

  • Es unterstützt die Dekodierung von animierten GIFs
  • Dadurch werden die endgültigen verkleinerten Bitmaps im Festplatten-Cache abgelegt, was bedeutet, dass das Zurücklesen aus dem Festplatten-Cache extrem schnell ist.

Fazit: Ich empfehle jetzt die Verwendung von Picasso + OkHttp, da dies die beste Kombination aus Flexibilität, API, Leistung und Stabilität bietet. Wenn Sie GIF-Unterstützung benötigen, können Sie auch Glide in Betracht ziehen.

45
BladeCoder

Ich habe eine App implementiert, die ständig Bilder aus dem Internet abrufen und anzeigen soll. Ich wollte gerade einen Bild-Cache-Mechanismus programmieren, bevor mir ein Freund den Universal Image Loader empfahl.

Das UIL ist sehr gut anpassbar. Es ist so anpassbar, dass ein Neuling leicht etwas falsch machen kann. Die UIL war jedoch in meiner Anwendung langsam und wurde etwas langsamer. Mein Anwendungsfall war eine ListView mit Bildern.

Gestern habe ich nach einer Alternative zur UIL gesucht und Picasso entdeckt. Picasso war einfach zu integrieren und zu verwenden: Nur Picasso.context(context).load(url).into(imageview) und das Bild konnte schneller und reibungsloser integriert werden.

Für mich ist Picasso definitiv die zu verwendende API. Meine Erfahrung mit UIL war nicht gut.

7
Samuel L

Ich denke, ImageLoader ist anpassbarer und flexibler als die Picasso-Bibliothek.

0
Jin Ding