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:
Unter iOS habe ich das AFNetworking Projekt ausgiebig genutzt. Gibt es eine entsprechende Bibliothek für Android?
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).
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.
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.
Mehrteilige Anfragen (Lösung: https://github.com/vinaysshenoy/enhanced-volley )
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!
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
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
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):
(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.
RoboSpice Vs. Volley
Von https://groups.google.com/forum/#!topic/robospice/QwVCfY_glOQ
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
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.
Um die Diskussion aus meiner Erfahrung mit Volley ein wenig zu erweitern:
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.
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.
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).
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.
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.
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
Und noch eine Option: https://github.com/apptik/jus
Und viele andere nützliche Funktionen wie Marker, Transformatoren usw.