Zweiteilige Frage eines iOS-Entwicklers, der Android lernt und an einem Android-Projekt arbeitet, das eine Vielzahl von Anfragen von JSON nach Bild- und Streaming-Download von Audio und Video stellt:
Unter iOS habe ich das AFNetworking- Projekt ausgiebig genutzt. Gibt es eine gleichwertige Bibliothek für Android?
Ich habe OkHTTP und Retrofit by Square sowie Volley gelesen , habe aber noch keine Erfahrung mit der Entwicklung mit ihnen. Ich hoffe, jemand könnte für jeden konkrete Beispiele für die besten Anwendungsfälle liefern. Nach dem, was ich gelesen habe, scheint OkHTTP das robusteste der drei zu sein und könnte die Anforderungen dieses Projekts (oben erwähnt) erfüllen.
android
networking
retrofit
android-networking
Alfie Hanssen
quelle
quelle
Antworten:
Verwenden Sie Retrofit, wenn Sie mit einem Webdienst kommunizieren. Verwenden Sie die Peer-Bibliothek Picasso, wenn Sie Bilder herunterladen. Verwenden Sie OkHTTP, wenn Sie HTTP-Vorgänge ausführen müssen, die außerhalb von Retrofit / Picasso liegen.
Volley konkurriert grob mit Retrofit + Picasso. Auf der positiven Seite ist es eine Bibliothek. Auf der negativen Seite handelt es sich um
eine undokumentierte,nicht unterstützte Bibliothek, die den Code über die Wand wirft und eine E / A-Präsentation darauf durchführt.BEARBEITEN - Volley wird jetzt offiziell von Google unterstützt. Bitte beziehen Sie sich auf das Google Developer Guide
Retrofit verwendet OkHTTP automatisch, falls verfügbar. Es gibt einen Kern von Jake Wharton , der Volley mit OkHTTP verbindet.
Wahrscheinlich werden Sie keine von ihnen für "Streaming-Download von Audio und Video" verwenden, gemäß der herkömmlichen Definition von "Streaming". Stattdessen verarbeitet das Medienframework von Android diese HTTP-Anforderungen für Sie.
Wenn Sie jedoch versuchen möchten, Ihr eigenes HTTP-basiertes Streaming durchzuführen, sollte OkHTTP dieses Szenario behandeln. Ich erinnere mich nicht, wie gut Volley mit diesem Szenario umgehen würde. Weder Retrofit noch Picasso sind dafür ausgelegt.
quelle
Wenn Sie sich die Volley-Perspektive ansehen, sehen Sie hier einige Vorteile für Ihre Anforderung:
Volley konzentriert sich einerseits ganz auf die Bearbeitung einzelner, kleiner HTTP-Anfragen. Wenn Ihre HTTP-Anforderungsbearbeitung einige Besonderheiten aufweist, hat Volley wahrscheinlich einen Haken für Sie. Wenn Sie andererseits eine Eigenart in Ihrer Bildverarbeitung haben, ist ImageCache der einzige echte Haken, den Sie haben . "Es ist nicht nichts, aber es ist auch nicht viel!" Aber es hat noch weitere Vorteile wie Sobald Sie Ihre Anforderungen definiert haben, ist die Verwendung innerhalb eines Fragments oder einer Aktivität im Gegensatz zu parallelen AsyncTasks problemlos
Vor- und Nachteile von Volley:
Was ist schön an Volley?
Der Netzwerkteil ist nicht nur für Bilder. Volley soll ein wesentlicher Bestandteil Ihres Backends sein. Für ein neues Projekt, das auf einem einfachen REST-Service basiert, könnte dies ein großer Gewinn sein.
NetworkImageView ist aggressiver in Bezug auf die Bereinigung von Anforderungen als Picasso und konservativer in seinen GC-Verwendungsmustern. NetworkImageView verwendet ausschließlich starke Speicherreferenzen und bereinigt alle Anforderungsdaten, sobald eine neue Anforderung für eine ImageView gestellt wird oder sobald diese ImageView vom Bildschirm verschoben wird.
Performance. In diesem Beitrag wird diese Behauptung nicht bewertet, aber sie haben eindeutig darauf geachtet, in ihren Speichernutzungsmustern vernünftig zu sein. Volley bemüht sich auch, Rückrufe an den Hauptthread zu stapeln, um die Kontextumschaltung zu reduzieren.
Volley hat offenbar auch Zukunft. Schauen Sie sich RequestFuture an, wenn Sie interessiert sind.
Wenn Sie mit hochauflösenden komprimierten Bildern arbeiten, ist Volley die einzige Lösung, die hier gut funktioniert.
Volley kann mit Okhttp verwendet werden (neue Version von Okhttp unterstützt NIO für eine bessere Leistung)
Volley spielt gut mit dem Aktivitätslebenszyklus.
Probleme mit Volley:
Da Volley neu ist, werden einige Dinge noch nicht unterstützt, aber es ist behoben.
Mehrteilige Anfragen (Lösung: https://github.com/vinaysshenoy/enhanced-volley )
Der Statuscode 201 wird als Fehler angesehen. Der Statuscode von 200 bis 207 ist jetzt eine erfolgreiche Antwort. (Behoben: https://github.com/Vinayrraj/CustomVolley )
Update: In der neuesten Version von Google Volley ist der Fehler mit den 2XX-Statuscodes jetzt behoben ! Dank an Ficus Kirkpatrick!
Es ist weniger dokumentiert, aber viele Leute unterstützen Volleyball in Github. Eine Java-ähnliche Dokumentation finden Sie hier . Auf der Android-Entwickler-Website finden Sie möglicherweise eine Anleitung zum Übertragen von Netzwerkdaten mit Volley . Und Volley-Quellcode finden Sie bei Google Git
Verwenden Sie zum Lösen / Ändern der Umleitungsrichtlinie von Volley Framework Volley mit OkHTTP (CommonsWare oben erwähnt).
Sie können auch das Vergleichen des Bildladens von Volley mit Picasso lesen
Nachrüstung:
Es wird von Square veröffentlicht. Dies bietet sehr einfach zu verwendende REST-APIs (Update: Voila! Mit NIO-Unterstützung)
Vorteile der Nachrüstung:
Im Vergleich zu Volley ist der REST-API-Code von Retrofit kurz und bietet eine hervorragende API-Dokumentation sowie gute Unterstützung in Communities! Es ist sehr einfach, in die Projekte hinzuzufügen.
Wir können es mit jeder Serialisierungsbibliothek mit Fehlerbehandlung verwenden.
Update: - In Retrofit 2.0.0-beta2 gibt es viele sehr gute Änderungen
Nachteile der Nachrüstung für Version 1.6:
Die speicherbezogene Fehlerbehandlungsfunktion ist nicht gut (in älteren Versionen von Retrofit / OkHttp) und nicht sicher, ob sie mit Okio mit Java NIO-Unterstützung verbessert wurde.
Wenn wir dies nicht ordnungsgemäß verwenden, kann dies zu einer minimalen Unterstützung beim Einfädeln führen.
(Alle oben genannten Nachteile wurden in der neuen Version von Retrofit 2.0 Beta behoben.)
================================================== ======================
Aktualisieren:
Leistungsbenchmarks für Android Async vs Volley vs Retrofit (Millisekunden, niedrigerer Wert ist besser):
(Zu Ihrer Information über den Informationen zu Retrofit-Benchmarks werden sich die Java NIO-Unterstützung verbessern, da die neue Version von OKhttp von der NIO Okio-Bibliothek abhängig ist.)
Wann soll man Volley benutzen?!
Wir können Volley verwenden, wenn wir Bilder laden und REST-APIs verwenden müssen. Für viele n / w-Anfragen wird gleichzeitig ein Warteschlangensystem für Netzwerkanrufe benötigt! Auch Volley hat eine bessere speicherbezogene Fehlerbehandlung als Retrofit!
OkHttp kann mit Volley verwendet werden, Retrofit verwendet standardmäßig OkHttp ! Es bietet SPDY- Unterstützung, Verbindungspooling, Festplatten-Caching und transparente Komprimierung! Vor kurzem wurde Java NIO mit der Okio- Bibliothek unterstützt.
Quelle, Gutschrift: Volley-gegen-Nachrüstung von Herrn Josh Ruesch
Hinweis: Beim Streaming hängt es davon ab, welche Art von Streaming Sie wie RTSP / RTCP wünschen.
quelle
MultipartEntityBuilder
in derhttpmime
Bibliothek verwenden können.RoboSpice Vs. Volley
Von https://groups.google.com/forum/#!topic/robospice/QwVCfY_glOQ
quelle
compile 'com.mcxiaoke.volley:library:1.0.+'
AFNetworking für Android:
Schnelles Android-Netzwerk ist da
Die schnelle Android-Netzwerkbibliothek unterstützt alle Arten von HTTP / HTTPS-Anforderungen wie GET, POST, DELETE, HEAD, PUT, PATCH
Die Fast Android Networking Library unterstützt das Herunterladen von Dateitypen aller Art
Die schnelle Android-Netzwerkbibliothek unterstützt das Hochladen aller Dateitypen (unterstützt das mehrteilige Hochladen).
Fast Android Networking Library unterstützt das Abbrechen einer Anfrage
Die schnelle Android-Netzwerkbibliothek unterstützt das Festlegen der Priorität für jede Anforderung (LOW, MEDIUM, HIGH, IMMEDIATE).
Die schnelle Android-Netzwerkbibliothek unterstützt RxJava
Da OkHttp als Netzwerkschicht verwendet wird, werden folgende Funktionen unterstützt:
Die schnelle Android-Netzwerkbibliothek unterstützt die HTTP / 2-Unterstützung, sodass alle Anforderungen an denselben Host einen Socket gemeinsam nutzen können
Die schnelle Android-Netzwerkbibliothek verwendet Verbindungspooling, wodurch die Anforderungslatenz verringert wird (wenn HTTP / 2 nicht verfügbar ist).
Transparentes GZIP verkleinert die Downloadgröße
Die schnelle Android-Netzwerkbibliothek unterstützt das Zwischenspeichern von Antworten, wodurch das Netzwerk für wiederholte Anforderungen vollständig vermieden wird
Danke: Die Bibliothek wurde von mir erstellt
quelle
Async HTTP Client loopj vs. Volley
Die Besonderheiten meines Projekts sind kleine HTTP-REST-Anforderungen, alle 1-5 Minuten.
Ich verwende seit langer Zeit einen asynchronen HTTP-Client (1.4.1). Die Leistung ist besser als bei Verwendung des Vanilla Apache httpClient oder einer HTTP-URL-Verbindung. Wie auch immer, die neue Version der Bibliothek funktioniert bei mir nicht: Library Inter Exception Cut Chain of Callbacks.
Das Lesen aller Antworten motivierte mich, etwas Neues auszuprobieren. Ich habe die Volley HTTP-Bibliothek ausgewählt.
Nachdem ich es einige Zeit benutzt habe, auch ohne Tests, sehe ich deutlich, dass die Reaktionszeit auf 1,5x, 2x Volley gesunken ist.
Vielleicht ist Retrofit besser als ein asynchroner HTTP-Client? Ich muss es versuchen. Aber ich bin mir sicher, dass Volley nichts für mich ist.
quelle
Um der Diskussion aus meiner Erfahrung mit Volley etwas hinzuzufügen:
Volley verarbeitet Streaming-Uploads oder -Downloads in keiner Weise. Das heißt, der gesamte Anforderungshauptteil muss sich im Speicher befinden, und Sie können weder eine verwenden
OutputStream
, um den Anforderungshauptteil in den zugrunde liegenden Socket zu schreiben, noch können Sie eine verwendenInputStream
, um den Antworttext zu lesen, wie dies bei Basic derHttpURLConnection
Fall ist. Daher ist Volley eine schlechte Wahl für das Hoch- oder Herunterladen großer Dateien. Ihre Anfragen und Antworten sollten klein sein. Dies ist eine der größten Einschränkungen von Volley, auf die ich persönlich gestoßen bin. Für das, was es wert ist, hat OkHttp Schnittstellen für die Arbeit mit Streams.Das Fehlen einer offiziellen Dokumentation ist ärgerlich, obwohl ich das durch Lesen des Quellcodes umgehen konnte, der ziemlich einfach zu befolgen ist. Was störender ist, ist, dass Volley, soweit ich das beurteilen kann, keine offiziellen Release-Versionen und kein Maven- oder Gradle-Artefakt hat und daher die Verwaltung als Abhängigkeit mehr Kopfschmerzen bereitet als beispielsweise jede der Bibliotheken, die Square veröffentlicht hat . Sie klonen einfach ein Repo, bauen ein Glas und sind auf sich allein gestellt. Suchen Sie nach einer Fehlerbehebung? Holen Sie und hoffen Sie, dass es da ist. Sie könnten auch andere Sachen bekommen; es wird nicht dokumentiert. Meiner Meinung nach bedeutet dies effektiv, dass Volley eine nicht unterstützte Bibliothek von Drittanbietern ist, obwohl die Codebasis einigermaßen aktiv ist. Vorbehalt Emptor.
Das Verknüpfen des Inhaltstyps mit dem Klassen- / Anforderungstyp (JsonObjectRequest, ImageRequest usw.) ist etwas umständlich und verringert die Flexibilität des aufrufenden Codes ein wenig, da Sie an die vorhandene Hierarchie des Anforderungstyps von Volley gebunden sind. Ich mag die Unkompliziertheit, Content-Type wie alle anderen als Header festzulegen (tun Sie dies übrigens nicht mit Volley; Sie erhalten am Ende zwei Content-Type-Header!). Das ist jedoch nur meine persönliche Meinung und kann umgangen werden.
Das heißt nicht, dass Volley einige nützliche Funktionen nicht hat. Das tut es sicherlich. Leicht anpassbare Wiederholungsrichtlinien, transparentes Caching, eine Abbruch-API und Unterstützung für die Anforderungsplanung und gleichzeitige Verbindungen sind großartige Funktionen. Sie müssen nur wissen, dass dies nicht für alle HTTP-Anwendungsfälle vorgesehen ist (siehe Punkt 1 oben) und dass es einige Kopfschmerzen gibt, wenn Volley in Ihrer App für die Produktion verwendet wird (Punkt 2).
quelle
Ich habe kürzlich eine Bibliothek namens ion gefunden , die ein kleines Extra auf den Tisch bringt.
ion verfügt über eine integrierte Unterstützung für das Herunterladen von Bildern, die in ImageView, JSON (mithilfe von GSON), Dateien und eine sehr praktische Unterstützung für das Threading von Benutzeroberflächen integriert ist.
Ich verwende es für ein neues Projekt und bisher waren die Ergebnisse gut. Die Verwendung ist viel einfacher als bei Volley oder Retrofit.
quelle
Hinzufügen zu der akzeptierten Antwort und dem, was LOG_TAG gesagt hat ... Damit Volley Ihre Daten in einem Hintergrundthread analysieren kann, müssen Sie eine Unterklasse erstellen,
Request<YourClassName>
da dieonResponse
Methode im Hauptthread aufgerufen wird und das Parsen im Hauptthread dazu führen kann, dass die Benutzeroberfläche verzögert wird, wenn Ihre Antwort erfolgt ist groß. Lesen Sie hier, wie das geht.quelle
Nachrüstung 1.9.0 gegen RoboSpice
Ich verwende beide in meiner App.
Robospice funktioniert schneller als Retrofit, wenn ich die verschachtelte JSON-Klasse analysiere. Weil Spice Manger alles für Sie tun wird. In Retrofit müssen Sie GsonConverter erstellen und deserialisieren.
Ich habe zwei Fragmente in derselben Aktivität erstellt und dieselbe Zeit mit zwei gleichen URLs aufgerufen.
quelle
Und noch eine Option: https://github.com/apptik/jus
Und viele andere nützliche Funktionen wie Marker, Transformatoren usw.
quelle