it-swarm.com.de

Vergleich von Android Netzwerkbibliotheken: OkHTTP, Retrofit und Volley

Eine zweiteilige Frage eines iOS-Entwicklers, der Android lernt und an einem Android -Projekt arbeitet, das eine Vielzahl von Anforderungen von JSON an Bilder bis hin zum Streaming-Download von Audio und Video stellt:

  1. Unter iOS habe ich das AFNetworking Projekt ausgiebig genutzt. Gibt es eine entsprechende Bibliothek für Android?

  2. Ich habe OkHTTP und Retrofit von Square sowie Volley gelesen, habe aber noch keine Erfahrung damit. Ich hoffe, dass jemand einige konkrete Beispiele für die besten Anwendungsfälle für jeden liefern kann. Nach dem, was ich gelesen habe, scheint OkHTTP das robusteste der drei zu sein und könnte die Anforderungen dieses Projekts erfüllen (siehe oben).

556
Alfie Hanssen

Ich hoffe, dass jemand einige konkrete Beispiele für die besten Anwendungsfälle für jeden liefern kann.

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 in etwa mit Retrofit + Picasso. Auf der positiven Seite ist es eine Bibliothek. Auf der negativen Seite ist es eine undokumentiert, Eine nicht unterstützte Bibliothek, in der Sie den Code über die Wand werfen und eine I | O-Präsentation darauf ausführen können.

EDIT - Volley wird jetzt offiziell von Google unterstützt. Bitte beziehen Sie sich auf Google Developer Guide

Nach dem, was ich gelesen habe, scheint OkHTTP das robusteste der 3 zu sein

Retrofit verwendet OkHTTP automatisch, falls verfügbar. Es gibt ein Gist von Jake Wharton , das Volley mit OkHTTP verbindet.

und könnte die Anforderungen dieses Projekts (oben erwähnt) behandeln.

Wahrscheinlich werden Sie keine von ihnen für "Streaming-Download von Audio und Video" nach der herkömmlichen Definition von "Streaming" verwenden. Stattdessen werden diese HTTP-Anforderungen von Android Media Framework für Sie verarbeitet.

Wenn Sie jedoch versuchen, Ihr eigenes HTTP-basiertes Streaming zu erstellen, sollte OkHTTP mit diesem Szenario umgehen. Ich erinnere mich nicht, wie gut Volley mit diesem Szenario umgehen würde. Weder Retrofit noch Picasso sind dafür ausgelegt.

636
CommonsWare

Mit Blick auf die Volley-Perspektive ergeben sich hier einige Vorteile für Ihre Anforderung:

Einerseits konzentriert sich Volley ganz auf die Bearbeitung einzelner kleiner HTTP-Anforderungen. Wenn Ihre HTTP-Anfrage also einige Macken aufweist, hat Volley wahrscheinlich einen Haken für Sie. Wenn Sie andererseits eine Eigenart in Ihrer Bildverarbeitung haben, ist der einzige echte Haken, den Sie haben, ImageCache . "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 schmerzlos

Vor- und Nachteile von Volley:

Was ist schön an Volley?

  • Der Netzwerkteil ist nicht nur für Bilder gedacht. Volley ist als integraler Bestandteil Ihres Backends gedacht. Für ein neues Projekt, das auf einem einfachen REST Service basiert, könnte dies ein großer Gewinn sein.

  • NetworkImageView ist aggressiver bei der Bereinigung von Anforderungen als Picasso und konservativer bei den GC-Verwendungsmustern. NetworkImageView verwendet ausschließlich starke Speicherreferenzen und bereinigt alle Anforderungsdaten, sobald eine neue Anforderung für eine ImageView eingeht oder wenn diese ImageView vom Bildschirm verschoben wird.

  • Performance. In diesem Beitrag wird diese Behauptung nicht bewertet, aber sie haben eindeutig darauf geachtet, in ihren Speicherverwendungsmustern umsichtig zu sein. Volley bemüht sich auch, Rückrufe an den Haupt-Thread zu stapeln, um die Kontextumschaltung zu reduzieren.

  • Volley hat anscheinend auch Futures. Schauen Sie sich RequestFuture an, wenn Sie interessiert sind.

  • Wenn Sie mit hochauflösenden komprimierten Bildern arbeiten, ist Volley die einzige Lösung, die gut funktioniert.

  • Volley kann mit Okhttp verwendet werden (Neue Version von Okhttp unterstützt NIO für eine bessere Leistung)

  • Volley spielt Nizza mit dem Aktivitätslebenszyklus.

Probleme mit Volley:
Da Volley neu ist, werden einige Dinge noch nicht unterstützt, aber es ist behoben.

  1. Mehrteilige Anfragen (Lösung: https://github.com/vinaysshenoy/enhanced-volley )

  2. statuscode 201 wird als Fehler interpretiert, Statuscode von 200 bis 207 sind jetzt erfolgreiche Antworten. (Behoben: https://github.com/Vinayrraj/CustomVolley )

    Update: In der neuesten Version von Google Volley ist der Fehler mit den 2XX-Statuscodes behoben jetzt! Danke an Ficus Kirkpatrick!

  3. es ist weniger dokumentiert, aber viele der Leute unterstützen Volley in Github, Java wie Dokumentation kann gefunden werden hier . Auf der Entwickler-Website Android finden Sie möglicherweise Anleitungen für Übertragen von Netzwerkdaten mit Volley . Und Volley-Quellcode finden Sie unter Google Git

  4. Zum Lösen/Ändern Redirect Policy of Volley Framework verwenden Volley mit OkHTTP (CommonsWare oben erwähnt)

Sie können dies auch lesen Volleys Bild wird mit Picasso verglichen

Nachrüstung:

Es wurde 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 eine gute Unterstützung in Communities! Es ist sehr einfach, in die Projekte einzufügen.

  • Wir können es mit jeder Serialisierungsbibliothek mit Fehlerbehandlung verwenden.

Update: - Retrofit 2.0.0-beta2 enthält viele sehr gute Änderungen

  • version 1.6 von Retrofit mit OkHttp 2.0 ist nun abhängig von Okio zur Unterstützung von Java.io und Java.nio was den Zugriff auf, das Speichern und Verarbeiten Ihrer Daten mit ByteString und Buffer erheblich vereinfacht, um einige clevere Dinge zu tun, um CPU zu sparen und Erinnerung. (FYI: Dies erinnert mich an die Koushs OIN Bibliothek mit NIO-Unterstützung!) Wir können Retrofit zusammen mit RxJava verwenden um REST Aufrufe zu kombinieren und zu verketten mit rxObservables um hässliche Rückrufketten zu vermeiden (um Rückrufhölle zu vermeiden !!).

Nachteile von Retrofit für Version 1.6:

  • Die speicherbezogene Fehlerbehandlungsfunktion ist nicht gut (in älteren Versionen von Retrofit/OkHttp) und nicht sicher, ob sie mit dem Okio mit Java NIO-Unterstützung verbessert wurde.

  • Eine minimale Unterstützung beim Einfädeln kann dazu führen, dass Sie die Hölle zurückrufen, wenn Sie dies nicht ordnungsgemäß verwenden.

(Alle oben genannten Nachteile wurden in der neuen Version von Retrofit 2.0 Beta behoben.)

================================================ =====================

Update:

Android Async vs Volley vs Retrofit Leistungsbenchmarks (Millisekunden, niedrigerer Wert ist besser):

Android Async vs Volley vs Retrofit performance benchmarks

(Zu Ihrer Information über Retrofit Benchmarks: Informationen werden mit der Java NIO-Unterstützung verbessert, da die neue Version von OKhttp von der NIO Okio-Bibliothek abhängig ist)

In allen drei Tests mit unterschiedlichen Wiederholungen (1 - 25 Mal) war Volley zwischen 50% und 75% schneller. Die Nachrüstung war beeindruckend 50% bis 90% schneller als die von AsyncTasks und traf denselben Endpunkt genauso oft. In der Dashboard-Testsuite führte dies dazu, dass die Daten einige Sekunden schneller geladen/analysiert wurden. Das ist ein gewaltiger Unterschied in der realen Welt. Um die Tests fair zu gestalten, enthielten die Zeiten für AsyncTasks/Volley die JSON-Analyse, die Retrofit automatisch für Sie durchführt.

RetroFit gewinnt im Benchmarktest!

Am Ende entschieden wir uns für Retrofit für unsere Anwendung. Es ist nicht nur lächerlich schnell, es passt auch sehr gut zu unserer bestehenden Architektur. Wir konnten ein übergeordnetes Callback-Interface erstellen, das automatisch Fehlerbehandlung, Caching und Paginierung für unsere APIs durchführt. Um in Retrofit zusammengeführt zu werden, mussten wir unsere Variablen umbenennen, um unsere Modelle GSON-kompatibel zu machen, einige einfache Schnittstellen schreiben, Funktionen aus der alten API löschen und unsere Fragmente so ändern, dass AsyncTasks nicht mehr verwendet werden. Jetzt, da wir einige Fragmente vollständig konvertiert haben, ist es ziemlich schmerzlos. Es gab einige wachsende Schmerzen und Probleme, die wir überwinden mussten, aber insgesamt verlief es reibungslos. Am Anfang hatten wir einige technische Probleme/Fehler, aber Square hat eine fantastische Google+ Community, die uns dabei helfen konnte.

Wann sollte man Volley benutzen ?!

Wir können Volley verwenden, wenn wir sowohl Bilder laden als auch REST APIs verbrauchen müssen! Das Warteschlangensystem für Netzwerkanrufe wird für viele n/w Anfragen gleichzeitig benötigt! auch Volley hat eine bessere speicherbezogene Fehlerbehandlung als Retrofit!

OkHttp kann mit Volley verwendet werden, Retrofit verwendet OkHttp standardmäßig! Es hat SPDY Unterstützung, Verbindungspooling, Festplatten-Caching, transparente Komprimierung! Vor kurzem hat es einige Unterstützung von Java NIO mit Okio Bibliothek bekommen.

Quelle, Kredit: volley-vs-retrofit von Herrn Josh Ruesch

Hinweis: Über Streaming hängt es davon ab, welche Art von Streaming Sie wie RTSP/RTCP möchten.

351
LOG_TAG

RoboSpice Vs. Volley

Von https://groups.google.com/forum/#!topic/robospice/QwVCfY_glOQ

  • RoboSpice (RS) basiert auf Services und respektiert die Android Philosophie mehr als Volley. Volley basiert auf Threads und dies ist nicht die Art und Weise, wie die Hintergrundverarbeitung unter Android erfolgen sollte. Letztendlich können Sie beide Bibliotheken ausgraben und feststellen, dass sie sich ziemlich ähnlich sind, aber unsere Vorgehensweise bei der Hintergrundverarbeitung ist mehr Android -orientiert. So können wir beispielsweise den Benutzern mitteilen, dass RS tatsächlich etwas unternimmt im Hintergrund, was für Volley schwer sein würde (eigentlich gar nicht).
  • RoboSpice und Volley bieten beide nützliche Funktionen wie Priorisierung, Richtlinien für Wiederholungsversuche und Stornierungsanfragen. Aber RS ​​bietet mehr: ein erweitertes und umfangreicheres Caching mit Cache-Verwaltung, Anforderungsaggregation, mehr Funktionen wie das Repluggen auf eine ausstehende Anforderung, das Behandeln des Cache-Ablaufs, ohne auf Server-Header angewiesen zu sein usw.
  • RoboSpice leistet mehr außerhalb des UI-Threads: Volley wird Ihre POJOs im Haupt-Thread deserialisieren, was für mich schrecklich ist. Mit RS reagiert Ihre App schneller.
  • In Bezug auf die Geschwindigkeit brauchen wir auf jeden Fall Metriken. RS ist jetzt super schnell geworden, aber wir haben immer noch keine Figur hier. Volley sollte theoretisch etwas schneller sein, aber RS ​​ist jetzt massiv parallel ... wer weiß?
  • RoboSpice bietet ein großes Kompatibilitätsspektrum mit Erweiterungen. Sie können es mit okhttp, retrofit, ormlite (beta), jackson, jackson2, gson, xml serializer, google http client, spring android ... verwenden. Volley kann mit ok http verwendet werden und verwendet gson. das ist es.
  • Volley bietet mehr UI-Zucker als RS. Volley stellt NetworkImageView zur Verfügung, RS stellt einen Adapter für Spicelists zur Verfügung. In Sachen Ausstattung ist es noch nicht so weit, aber ich glaube, Volley ist in diesem Bereich weiter fortgeschritten.
  • Seit seiner ersten Veröffentlichung wurden mehr als 200 Fehler in RoboSpice behoben. Es ist ziemlich robust und wird häufig in der Produktion eingesetzt. Volley ist weniger ausgereift, aber seine Nutzerbasis sollte schnell wachsen (Google-Effekt).
  • RoboSpice ist auf maven central verfügbar. Volley ist schwer zu finden;)
44
Snicolas

AFNetworking für Android:

Fast Android Networking ist hier

Fast Android Networking Library unterstützt alle Arten von HTTP/HTTPS-Anforderungen wie GET, POST, DELETE, HEAD, PUT, PATCH

Fast Android Networking Library unterstützt das Herunterladen aller Dateitypen

Fast Android Networking Library unterstützt das Hochladen beliebiger Dateitypen (unterstützt das Hochladen von mehreren Teilen)

Fast Android Networking Library unterstützt das Abbrechen einer Anforderung

Fast Android Networking Library unterstützt das Festlegen der Priorität für jede Anforderung (LOW, MEDIUM, HIGH, IMMEDIATE)

Fast Android Networking Library unterstützt RxJava

Da OkHttp als Netzwerkebene verwendet wird, werden unterstützt:

Schnelle Android Netzwerkbibliothek unterstützt HTTP/2-Unterstützung ermöglicht allen Anforderungen an denselben Host, einen Socket gemeinsam zu nutzen

Schnelle Android Netzwerkbibliothek verwendet Verbindungspooling, wodurch die Anforderungslatenz verringert wird (falls HTTP/2 nicht verfügbar ist)

Transparentes GZIP verkleinert die Download-Größen

Schnelle Android Netzwerkbibliothek unterstützt das Zwischenspeichern von Antworten, wodurch das Netzwerk für wiederholte Anforderungen vollständig umgangen wird

Danke: Die Bibliothek wurde von mir erstellt

20
Amit Shekhar

Async HTTP client loopj vs. Volley

Die Besonderheiten meines Projekts sind kleine HTTP REST -Anfragen, alle 1-5 Minuten.

Ich verwende seit langer Zeit einen asynchronen HTTP-Client (1.4.1). Die Leistung ist besser als mit dem Vanilla Apache httpClient oder einer HTTP-URL-Verbindung. Wie auch immer, die neue Version der Bibliothek funktioniert bei mir nicht: Bibliothek unter Ausnahmen verkürzt Kette von Rückrufen.

Das Lesen aller Antworten hat mich motiviert, etwas Neues auszuprobieren. Ich habe die Volley-HTTP-Bibliothek ausgewählt.

Nach längerem Gebrauch, 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.

18

Um die Diskussion aus meiner Erfahrung mit Volley ein wenig zu erweitern:

  1. Volley verarbeitet keine Streaming-Uploads oder -Downloads. Das heißt, der gesamte Anforderungshauptteil muss sich im Speicher befinden, und Sie können weder einen OutputStream zum Schreiben des Anforderungshauptteils in den zugrunde liegenden Socket noch einen InputStream zum Lesen des Antworthauptteils als Basis verwenden HttpURLConnection tut. Daher ist Volley eine schlechte Wahl für das Hochladen oder Herunterladen großer Dateien. Ihre Anfragen und Antworten sollten klein sein. Dies ist eine der größten Einschränkungen von Volley, denen ich persönlich begegnet bin. OkHttp bietet Schnittstellen für die Arbeit mit Streams.

  2. Das Fehlen offizieller Dokumentation ist ärgerlich, obwohl ich das umgehen konnte, indem ich den Quellcode las, der ziemlich einfach zu befolgen ist. Was lästiger ist, ist, dass Volley, soweit ich das beurteilen kann, keine offiziellen Release-Versionen und kein Maven- oder Gradle-Artefakt hat und daher das Verwalten als Abhängigkeit mehr Kopfzerbrechen bereitet, als es beispielsweise eine der Bibliotheken auf dem Square veröffentlicht hat . Du klonst einfach ein Repo, baust ein Glas und bist auf dich allein gestellt. Suchen Sie nach einer Fehlerbehebung? Hol es dir und hoffe es ist da. Sie könnten auch ein paar andere Sachen besorgen; 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.

  3. Das Verknüpfen des Inhaltstyps mit der Klasse/dem Anforderungstyp (JsonObjectRequest, ImageRequest usw.) ist etwas umständlich und verringert die Flexibilität des aufrufenden Codes ein wenig, da Sie an die bestehende Anforderungshierarchie von Volley gebunden sind. Mir gefällt die einfache Möglichkeit, Content-Type als Header wie jeden anderen zu definieren (mach das übrigens nicht mit Volley, du wirst am Ende zwei Content-Type-Header haben!). 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 lediglich wissen, dass dies nicht für alle HTTP-Anwendungsfälle vorgesehen ist (siehe Punkt 1 oben) und dass einige Probleme auftreten, wenn Sie Volley in Ihrer App in den Produktionsbetrieb versetzen (Punkt 2).

11
Jeff

Ich habe kürzlich eine Bibliothek namens ion gefunden, die ein kleines Extra auf den Tisch bringt.

ion hat eine integrierte Unterstützung für das Herunterladen von Bildern, die in ImageView, JSON (mithilfe von GSON), Dateien und eine sehr praktische UI-Threading-Unterstützung integriert ist.

Ich benutze es für ein neues Projekt und bis jetzt waren die Ergebnisse gut. Die Bedienung ist wesentlich einfacher als bei Volley oder Retrofit.

9
Tiago Gaspar

Zur akzeptierten Antwort und dem, was LOG_TAG gesagt hat, hinzufügen .... damit Volley Ihre Daten in einem Hintergrundthread analysiert, müssen Sie Request<YourClassName> als onResponse -Methode für den Hauptthread und das Parsen für den Hauptthread unterklassifizieren Thread kann die Benutzeroberfläche verzögern, wenn Ihre Antwort groß ist. Lesen Sie hier wie das geht.

4
upenpat

Retrofit 1.9.0 vs. RoboSpice

Ich verwende beides in meiner App.

Robospice arbeitet schneller als Retrofit, wenn ich die verschachtelte JSON-Klasse analysiere. Weil Spice Manger alles für Sie erledigt. In Retrofit müssen Sie GsonConverter erstellen und deserialisieren.

Ich habe zwei Fragmente in derselben Aktivität erstellt und die gleiche Zeit mit zwei gleichen Arten von URLs aufgerufen.

09-23 20:12:32.830  16002-16002/com.urbanpro.seeker E/RETROFIT﹕   RestAdapter Init
09-23 20:12:32.833  16002-16002/com.urbanpro.seeker E/RETROFIT﹕ calling the method
09-23 20:12:32.837  16002-16002/com.urbanpro.seeker E/ROBOSPICE﹕ initialzig spice manager
09-23 20:12:32.860  16002-16002/com.urbanpro.seeker E/ROBOSPICE﹕ Executing the method
09-23 20:12:33.537  16002-16002/com.urbanpro.seeker E/ROBOSPICE﹕ on SUcceess
09-23 20:12:33.553  16002-16002/com.urbanpro.seeker E/ROBOSPICE﹕ gettting the all contents
09-23 20:12:33.601  16002-21819/com.urbanpro.seeker E/RETROFIT﹕ deseriazation starts
09-23 20:12:33.603  16002-21819/com.urbanpro.seeker E/RETROFIT﹕ deseriazation ends
3
Asthme

Und noch eine Option: https://github.com/apptik/jus

  • Es ist modular aufgebaut wie Volley, wird jedoch erweitert und die Dokumentation verbessert, wobei verschiedene HTTP-Stacks und Konverter sofort unterstützt werden
  • Es verfügt über ein Modul zum Generieren von Server-API-Schnittstellenzuordnungen wie Retrofit
  • Es hat auch JavaRx-Unterstützung

Und viele andere nützliche Funktionen wie Marker, Transformatoren usw.

2
djodjo