Ich verwende a ListView
, um einige Bilder und Bildunterschriften anzuzeigen, die diesen Bildern zugeordnet sind. Ich bekomme die Bilder aus dem Internet. Gibt es eine Möglichkeit, Bilder verzögert zu laden, damit während der Text angezeigt wird, die Benutzeroberfläche nicht blockiert wird und Bilder beim Herunterladen angezeigt werden?
Die Gesamtzahl der Bilder ist nicht festgelegt.
setUrl
.Antworten:
Folgendes habe ich erstellt, um die Bilder aufzunehmen, die meine App derzeit anzeigt. Bitte beachten Sie, dass das hier verwendete "Log" -Objekt mein benutzerdefinierter Wrapper um die letzte Log-Klasse in Android ist.
quelle
LRU Cache
developer.android.com/training/displaying-bitmaps/ gehört.Ich habe eine einfache Demo einer faulen Liste (bei GitHub) mit Bildern erstellt.
Es kann für jemanden hilfreich sein. Es werden Bilder im Hintergrund-Thread heruntergeladen. Bilder werden auf einer SD-Karte und im Speicher zwischengespeichert. Die Cache-Implementierung ist sehr einfach und reicht gerade für die Demo aus. Ich dekodiere Bilder mit inSampleSize, um den Speicherverbrauch zu reduzieren. Ich versuche auch, mit recycelten Ansichten richtig umzugehen.
quelle
Ich empfehle das Open Source Instrument Universal Image Loader . Es basiert ursprünglich auf Fedor Vlasovs Projekt LazyList und wurde seitdem erheblich verbessert.
quelle
Multithreading For Performance , ein Tutorial von Gilles Debunne.
Dies ist aus dem Android Developers Blog. Der vorgeschlagene Code verwendet:
AsyncTasks
.FIFO cache
.garbage collect
handhabender Cache.Drawable
beim Herunterladen.quelle
Update: Beachten Sie, dass diese Antwort jetzt ziemlich unwirksam ist. Der Garbage Collector reagiert aggressiv auf SoftReference und WeakReference, sodass dieser Code NICHT für neue Apps geeignet ist. (Versuchen Sie stattdessen Bibliotheken wie Universal Image Loader , die in anderen Antworten vorgeschlagen wurden.)
Vielen Dank an James für den Code und Bao-Long für den Vorschlag, SoftReference zu verwenden. Ich habe die SoftReference-Änderungen in James 'Code implementiert. Leider haben SoftReferences dazu geführt, dass meine Bilder zu schnell im Müll gesammelt wurden. In meinem Fall war es ohne das SoftReference-Zeug in Ordnung, da meine Listengröße begrenzt und meine Bilder klein sind.
Es gibt eine Diskussion vor einem Jahr über die SoftReferences in Google-Gruppen: Link zum Thread . Als Lösung für die zu frühe Speicherbereinigung schlagen sie die Möglichkeit vor, die VM-Heap-Größe manuell mit dalvik.system.VMRuntime.setMinimumHeapSize () festzulegen, was für mich nicht sehr attraktiv ist.
quelle
Picasso
Verwenden Sie die Picasso-Bibliothek von Jake Wharton. (Eine perfekte ImageLoading-Bibliothek vom Entwickler von ActionBarSherlock)
Eine leistungsstarke Bibliothek zum Herunterladen und Zwischenspeichern von Bildern für Android.
Bilder verleihen Android-Anwendungen den dringend benötigten Kontext und das visuelle Flair. Picasso ermöglicht das problemlose Laden von Bildern in Ihre Anwendung - häufig in einer Codezeile!
Viele häufige Probleme beim Laden von Bildern unter Android werden von Picasso automatisch behoben:
Umgang mit ImageView-Recycling und Download-Stornierung in einem Adapter. Komplexe Bildtransformationen mit minimalem Speicherbedarf. Automatisches Zwischenspeichern von Speicher und Festplatten.
Picasso Jake Whartons Bibliothek
Gleiten
Glide ist ein schnelles und effizientes Open Source-Medienverwaltungsframework für Android, das Mediendecodierung, Speicher- und Festplatten-Caching sowie Ressourcenpooling in einer einfachen und benutzerfreundlichen Oberfläche zusammenfasst.
Glide unterstützt das Abrufen, Dekodieren und Anzeigen von Videostills, Bildern und animierten GIFs. Glide enthält eine flexible API, mit der Entwickler fast jeden Netzwerkstapel anschließen können. Standardmäßig verwendet Glide einen benutzerdefinierten HttpUrlConnection-basierten Stack, enthält jedoch auch Dienstprogrammbibliotheken, die in das Volley-Projekt von Google oder in die OkHttp-Bibliothek von Square eingebunden sind.
Der Hauptfokus von Glide liegt darauf, das Scrollen einer Liste von Bildern so reibungslos und schnell wie möglich zu gestalten. Glide ist jedoch auch in fast allen Fällen wirksam, in denen Sie ein Remote-Bild abrufen, seine Größe ändern und anzeigen müssen.
Glide Image Loading Library
Fresko von Facebook
Fresco ist ein leistungsstarkes System zur Anzeige von Bildern in Android-Anwendungen.
Fresco kümmert sich um das Laden und Anzeigen von Bildern, sodass Sie dies nicht tun müssen. Es werden Bilder aus dem Netzwerk, dem lokalen Speicher oder lokalen Ressourcen geladen und ein Platzhalter angezeigt, bis das Bild angekommen ist. Es hat zwei Cache-Ebenen; eine im Speicher und eine im internen Speicher.
Fresko Github
In Android 4.x und niedriger legt Fresco Bilder in einem speziellen Bereich des Android-Speichers ab. Dadurch kann Ihre Anwendung schneller ausgeführt werden - und der gefürchtete OutOfMemoryError tritt viel seltener auf.
Fresko-Dokumentation
quelle
Hochleistungslader - nachdem ich die hier vorgeschlagenen Methoden untersucht hatte, verwendete ich Bens Lösung mit einigen Änderungen -
Ich habe festgestellt, dass die Arbeit mit Drawables schneller ist als mit Bitmaps, daher verwende ich stattdessen Drawables
Die Verwendung von SoftReference ist großartig, führt jedoch dazu, dass das zwischengespeicherte Bild zu oft gelöscht wird. Daher habe ich eine verknüpfte Liste hinzugefügt, die Bildreferenzen enthält, um zu verhindern, dass das Bild gelöscht wird, bis es eine vordefinierte Größe erreicht hat
Um den InputStream zu öffnen, habe ich java.net.URLConnection verwendet, mit dem ich den Webcache verwenden kann (Sie müssen zuerst einen Antwortcache festlegen, aber das ist eine andere Geschichte).
Mein Code:
quelle
import java.util.Map; import java.util.HashMap; import java.util.LinkedList; import java.util.Collections; import java.util.WeakHashMap; import java.lang.ref.SoftReference; import java.util.concurrent.Executors; import java.util.concurrent.ExecutorService; import android.graphics.drawable.Drawable; import android.widget.ImageView; import android.os.Handler; import android.os.Message; import java.io.InputStream; import java.net.MalformedURLException; import java.io.IOException; import java.net.URL; import java.net.URLConnection;
Ich habe dieses Android-Training absolviert und denke, dass es beim Herunterladen von Bildern hervorragende Arbeit leistet, ohne die Hauptbenutzeroberfläche zu blockieren. Es behandelt auch das Zwischenspeichern und das Scrollen durch viele Bilder: Effizientes Laden großer Bitmaps
quelle
1. Picasso ermöglicht das problemlose Laden von Bildern in Ihre Anwendung - häufig in einer Codezeile!
Verwenden Sie Gradle:
Nur eine Codezeile!
2. Glide Eine Bibliothek zum Laden und Zwischenspeichern von Bildern für Android, die sich auf reibungsloses Scrollen konzentriert
Verwenden Sie Gradle:
// Für eine einfache Ansicht:
3. fresco ist ein leistungsstarkes System zum Anzeigen von Bildern in Android-Anwendungen . Fresco kümmert sich um das Laden und Anzeigen von Bildern, sodass Sie dies nicht tun müssen.
Erste Schritte mit Fresco
quelle
Ich habe ein Tutorial geschrieben, in dem erklärt wird, wie Bilder in einer Listenansicht verzögert geladen werden. Ich gehe auf die Themen Recycling und Parallelität ein. Ich verwende auch einen festen Thread-Pool, um zu verhindern, dass viele Threads entstehen.
Faules Laden von Bildern im Listview Tutorial
quelle
Ich starte dazu einen Thread, um die Bilder im Hintergrund herunterzuladen und ihm für jedes Listenelement einen Rückruf zu geben. Wenn ein Bild vollständig heruntergeladen wurde, wird der Rückruf aufgerufen, der die Ansicht für das Listenelement aktualisiert.
Diese Methode funktioniert jedoch nicht sehr gut, wenn Sie Ansichten recyceln.
quelle
Ich möchte nur noch ein gutes Beispiel hinzufügen, XML-Adapter . Da es von Google verwendet wird und ich auch die gleiche Logik verwende, um einen OutOfMemory-Fehler zu vermeiden.
Grundsätzlich ist dieser ImageDownloader Ihre Antwort (da er die meisten Ihrer Anforderungen abdeckt). Einige können Sie auch darin implementieren.
quelle
Dies ist ein häufiges Problem unter Android, das von vielen Menschen auf viele Arten gelöst wurde. Meiner Meinung nach ist die beste Lösung, die ich gesehen habe, die relativ neue Bibliothek namens Picasso . Hier sind die Highlights:
Jake Wharton
von ActionBarSherlock Ruhm.ListView
Erkennungquelle
Ich habe NetworkImageView aus der neuen Android Volley Library verwendet
com.android.volley.toolbox.NetworkImageView
und es scheint ziemlich gut zu funktionieren. Anscheinend ist dies dieselbe Ansicht, die in Google Play und anderen neuen Google-Anwendungen verwendet wird. Auf jeden Fall einen Besuch wert.Tutorial zum Volley-Bild-Cache von Google I / O 2013
Entwickler Google Events
quelle
Die Ladezeit von Bildern aus dem Internet bietet viele Lösungen. Sie können auch die Bibliothek Android-Query verwenden . Es gibt Ihnen alle erforderlichen Aktivitäten. Stellen Sie sicher, was Sie tun möchten, und lesen Sie die Wiki-Seite der Bibliothek. Und lösen Sie die Einschränkung beim Laden von Bildern.
Das ist mein Code:
Es sollte Ihr Problem beim verzögerten Laden lösen.
quelle
Ich denke, dieses Problem ist bei Android-Entwicklern sehr beliebt, und es gibt viele solcher Bibliotheken, die behaupten, dieses Problem zu beheben, aber nur wenige von ihnen scheinen auf dem richtigen Weg zu sein. AQuery ist eine solche Bibliothek, aber sie ist in allen Aspekten besser als die meisten anderen und es lohnt sich, sie auszuprobieren .
quelle
Sie müssen versuchen, dieser Universal Loader ist am besten. Ich benutze dies, nachdem ich viele RnD auf faulem Laden gemacht habe.
Universal Image Loader
Eigenschaften
Android 2.0+ Unterstützung
quelle
Schauen Sie sich Shutterbug an , Applidiums leichtgewichtigen SDWebImage-Port (eine schöne Bibliothek für iOS) für Android. Es unterstützt asynchrones Caching, speichert fehlgeschlagene URLs, behandelt Parallelität gut und hilfreiche Unterklassen sind enthalten.
Pull-Anfragen (und Fehlerberichte) sind ebenfalls willkommen!
quelle
DroidParts verfügt über ImageFetcher , für dessen Start keine Konfiguration erforderlich ist.
Clone DroidPartsGram für ein Beispiel:
quelle
Nur ein kurzer Tipp für jemanden, der sich nicht sicher ist, welche Bibliothek zum verzögerten Laden von Bildern verwendet werden soll:
Es gibt vier grundlegende Möglichkeiten.
DIY => Nicht die beste Lösung, aber für ein paar Bilder und wenn Sie auf den Aufwand verzichten möchten, andere Bibliotheken zu verwenden
Volley's Lazy Loading Bibliothek => Von Jungs bei Android. Es ist schön und alles aber schlecht dokumentiert und daher ein Problem zu bedienen.
Picasso: Eine einfache Lösung, die einfach funktioniert. Sie können sogar die genaue Bildgröße angeben, die Sie einbringen möchten. Sie ist sehr einfach zu verwenden, aber möglicherweise nicht sehr "performant" für Apps, die mit riesigen Bildmengen umgehen müssen.
UIL: Der beste Weg, um Bilder faul zu laden. Sie können Bilder zwischenspeichern (Sie benötigen natürlich eine Erlaubnis), den Loader einmal initialisieren und dann Ihre Arbeit erledigen. Die ausgereifteste asynchrone Bildladebibliothek, die ich bisher gesehen habe.
quelle
Novoda hat auch eine großartige Bibliothek zum Laden fauler Bilder und viele Apps wie Songkick, Podio, SecretDJ und ImageSearch verwenden ihre Bibliothek.
Ihre Bibliothek wird hier auf Github gehostet und sie haben auch einen ziemlich aktiven Issues Tracker . Ihr Projekt scheint auch ziemlich aktiv zu sein, mit über 300 Commits zum Zeitpunkt des Schreibens dieser Antwort.
quelle
Überprüfen Sie meine Gabelung von LazyList . Grundsätzlich verbessere ich die LazyList, indem ich den Aufruf der ImageView verzögere und zwei Methoden erstelle:
Ich habe auch den ImageLoader verbessert, indem ich einen Singleton in dieses Objekt implementiert habe .
quelle
Wenn Sie das Shimmer-Layout wie Facebook anzeigen möchten, gibt es dafür eine offizielle Facebook-Bibliothek. FaceBook Shimmer Android
Es kümmert sich um alles. Sie müssen nur Ihren gewünschten Design-Code verschachtelt in einen schimmernden Rahmen einfügen. Hier ist ein Beispielcode.
Und hier ist der Java-Code dafür.
Fügen Sie diese Abhängigkeit in Ihre Gradle-Datei ein.
So sieht es aus.
quelle
Alle oben genannten Codes haben ihren eigenen Wert, aber mit meiner persönlichen Erfahrung versuchen Sie es einfach mit Picasso.
Picasso ist eine Bibliothek speziell für diesen Zweck. Tatsächlich verwaltet sie den Cache und alle anderen Netzwerkvorgänge automatisch. Sie müssen Ihrem Projekt eine Bibliothek hinzufügen und nur eine einzige Codezeile schreiben, um das Bild von der Remote-URL zu laden.
Bitte besuchen Sie hier: http://code.tutsplus.com/tutorials/android-sdk-working-with-picasso--cms-22149
quelle
Verwenden Sie die Gleitbibliothek. Es hat bei mir funktioniert und funktioniert auch bei Ihrem Code. Es funktioniert sowohl für Bilder als auch für Gifs.
quelle
Ich kann einen anderen Weg empfehlen, der wie ein Zauber funktioniert: Android Query.
Sie können diese JAR- Datei hier herunterladen
Als Beispiel:
Es ist sehr schnell und genau, und mit dieser Funktion finden Sie viele weitere Funktionen wie Animationen beim Laden, Abrufen einer Bitmap (falls erforderlich) usw.
quelle
Probieren Sie Aquery aus . Es verfügt über erstaunlich einfache Methoden zum asynchronen Laden und Zwischenspeichern von Bildern.
quelle
URLImageViewHelper ist eine erstaunliche Bibliothek, die Ihnen dabei hilft.
quelle
quelle
Ich hatte dieses Problem und implementierte lruCache. Ich glaube, Sie benötigen API 12 und höher oder verwenden die kompatible v4-Bibliothek. lurCache ist ein schneller Speicher, hat aber auch ein Budget. Wenn Sie sich also Sorgen machen, können Sie einen Diskcache verwenden ... Alles wird unter Zwischenspeichern von Bitmaps beschrieben .
Ich werde jetzt meine Implementierung bereitstellen, bei der es sich um einen Singleton handelt, den ich von einem beliebigen Ort aus aufrufe:
Hier ist der ideale Code zum Zwischenspeichern und Aufrufen des obigen Codes in getView eines Adapters beim Abrufen des Webbilds:
quelle