Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android SDK
Code

Eine Einführung in Volley

by
Difficulty:BeginnerLength:LongLanguages:
This post is part of a series called An Introduction to Volley.
Creating a Weather Application for Mars Using Volley

German (Deutsch) translation by Katharina Nevolina (you can also view the original English article)

Volley ist eine von Google entwickelte und während Google I/O 2013 eingeführte Netzwerkbibliothek. Sie wurde entwickelt, weil im Android-SDK keine Netzwerkklasse vorhanden ist, die ohne Störung der Benutzererfahrung arbeiten kann.

Bis zur Veröffentlichung von Volley waren die kanonische Java-Klasse java.net.HttpURLConnection und der Apache org.apache.http.client die einzigen Werkzeuge, die Android-Programmierern zur Verfügung standen, um ein RESTful-System zwischen einem Client und einem Remote-Backend zu entwickeln.

Abgesehen von der Tatsache, dass diese beiden Klassen nicht von Fehlern befreit sind, sollte beachtet werden, dass alles, was über eine einfache HTTP-Transaktion hinausging, von Anfang an geschrieben werden musste. Wenn Sie Bilder zwischenspeichern oder Anforderungen priorisieren möchten, mussten Sie sie von Grund auf entwickeln.

Glücklicherweise gibt es jetzt Volley, der speziell für diese Anforderungen entwickelt wurde.

1. Warum Volley?

Vermeiden Sie HttpUrlConnection und HttpClientBei

niedrigeren API-Levels (meistens bei Gingerbread und Froyo) sind HttpUrlConnection und HttpClient alles andere als perfekt. Es gibt einige bekannte Probleme und Fehler, die nie behoben wurden. Darüber hinaus wurde HttpClient in der letzten API-Aktualisierung (API 22) nicht mehr unterstützt. Das bedeutet, dass er nicht mehr gewartet wird und möglicherweise in einer zukünftigen Version entfernt wird.

Das sind ausreichende Gründe für die Entscheidung, auf eine zuverlässigere Art der Bearbeitung Ihrer Netzwerkanfragen umzusteigen.

Und vermeiden Sie auch AsyncTask

Seit der Einführung von Honeycomb (API 11) müssen Netzwerkoperationen in einem separaten Thread ausgeführt werden, der sich vom Haupt-Thread unterscheidet. Diese grundlegende Änderung führte zu einer massiven Nutzung der AsyncTask<Params, Progress, Result>-Spezifikation.

Mit AsyncTask definieren Sie zunächst einige vorbereitende Aktionen, z. B. die Definition des Kontexts in onPreExecute. Anschließend führen Sie Ihre asynchronen Aufgaben mit der Methode doInBackground aus. Schließlich behandeln Sie die Ergebnisse in onPostExecute. Es ist ziemlich unkompliziert, viel einfacher als die Implementierung eines Dienstes und enthält eine Menge Beispiele und Dokumentation.

Das Hauptproblem ist jedoch die Serialisierung der Aufrufe. Wenn Sie die AsyncTask-Klasse verwenden, können Sie nicht entscheiden, welche Anforderung zuerst geht und welche warten muss. Alles geschieht im FIFO-Verfahren (first In, first out).

Die Probleme treten zum Beispiel auf, wenn Sie eine Liste von Elementen laden müssen, die ein Miniaturbild angehängt haben. Wenn der Benutzer einen Bildlauf nach unten durchführt und neue Ergebnisse erwartet, können Sie Ihrer Aktivität nicht sagen, dass Sie zuerst den JSON der nächsten Seite und nur die Bilder der vorherigen Seite laden sollen. Dies kann zu einem ernsthaften Benutzererlebnisproblem in Anwendungen wie Facebook oder Twitter werden, bei denen die Liste der neuen Elemente wichtiger ist als die damit verknüpfte Miniaturansicht.

Volley zielt darauf ab, dieses Problem zu lösen, indem eine leistungsfähige API für die Löschung hinzugefügt wird. Sie müssen onPostExecute nicht mehr prüfen, ob die Aktivität während des Anrufs zerstört wurde. Das hilft, eine unerwünschte NullPointerException zu vermeiden.

Es ist viel schneller

Vor einiger Zeit hat das Google+ Team eine Reihe von Leistungstests mit den verschiedenen Methoden durchgeführt, mit denen Sie Netzwerkanfragen unter Android durchführen können. Volley erzielte in RESTful-Anwendungen eine bis zu zehnmal bessere Bewertung als die anderen Alternativen.

Es speichert alles

Volley speichert Anfragen automatisch und das ist wirklich lebensrettend. Kommen wir noch einmal zu meinem früheren Beispiel zurück. Sie haben eine Liste von Elementen (etwa ein JSON-Array), und jedem Element sind eine Beschreibung und eine Miniaturansicht zugeordnet. Denken Sie nun darüber nach, was passiert, wenn der Benutzer den Bildschirm dreht: Die Aktivität wird zerstört, die Liste wird erneut heruntergeladen, und die Bilder werden ebenfalls angezeigt. Lange Rede, kurze Ressourcenverschwendung und schlechte Benutzererfahrung.

Volley erweist sich als äußerst nützlich, um dieses Problem zu überwinden. Es erinnert sich an die vorherigen Aufrufe und kümmert sich um die Zerstörung und den Wiederaufbau von Aktivitäten. Es speichert alles, ohne dass Sie sich darum kümmern müssen.

Kleine Metadatenoperationen

Volley eignet sich hervorragend für kleine Anrufe, z. B. JSON-Objekte, Listenabschnitte, Details eines ausgewählten Elements usw. Es wurde für RESTful-Anwendungen entwickelt und gibt in diesem speziellen Fall das Beste heraus.

Es ist jedoch nicht so gut, wenn es für Streaming-Vorgänge und große Downloads verwendet wird. Entgegen der weit verbreiteten Meinung stammt Volleys Name nicht aus dem Sportwörterbuch. Es ist eher als wiederholte Ansammlung von Anrufen gedacht, die in einer Gruppe zusammengefasst sind. Es ist irgendwie intuitiv, warum diese Bibliothek nicht nützlich ist, wenn Sie statt einer Pfeile eine Kanonenkugel abfeuern möchten.

2. Unter der Haube

Volley arbeitet auf drei verschiedenen Ebenen, wobei jede Ebene mit einem eigenen Thread arbeitet.

Volley under the hood

Haupt-Bedroung

Im Hauptthread ist es im Einklang mit dem, was Sie bereits in der AsyncTask-Spezifikation tun, nur die Anforderung abzufeuern und die Antwort zu bearbeiten. Nicht mehr, nicht weniger.

Die Hauptkonsequenz ist, dass Sie tatsächlich alles ignorieren können, was in der Methode doInBackground vor sich ging. Volley verwaltet automatisch die HTTP-Transaktionen und die einfallenden Netzwerkfehler, die Sie zuvor beachten mussten.

Cache und Netzwerk-Threads

Wenn Sie eine Anforderung zur Warteschlange hinzufügen, geschieht dies unter der Haube. Zunächst überprüft Volley, ob die Anforderung vom Cache aus bedient werden kann. Wenn es möglich ist, wird die zwischengespeicherte Antwort gelesen, analysiert und zugestellt. Andernfalls wird es an den Netzwerk-Thread übergeben.

Auf dem Netzwerk-Thread arbeitet ständig ein Round-Robin mit einer Reihe von Threads. Der erste verfügbare Netzwerkthread nimmt die Anforderung in die Warteschlange zurück, stellt die HTTP-Anforderung, analysiert die Antwort und schreibt sie in den Cache. Zum Abschluss sendet er die geparste Antwort zurück an den Haupt-Thread, in dem Ihre Listener auf das Ergebnis warten.

3. Erste Schritte

Schritt 1: Volley importieren

Volley lässt sich nicht so gut einrichten. Es scheint, als gäbe es kein offizielles Repository von Maven, und das ist ziemlich verwirrend. Sie müssen sich auf den offiziellen Quellcode verlassen. Sie können Volley auf verschiedene Arten importieren.

Laden Sie zunächst die Volley-Quelle aus ihrem Repository herunter. Wenn Sie sich sicher fühlen, kann dieser Git-Befehl die ganze Arbeit für Sie erledigen:

Bis vor einigen Wochen konnten Sie alles über die ant-Kommandozeile (android-updateprojekt -p . und dann ant-jar) zusammenfassen und Ihre JAR-Bibliothek in Ihr Android Studio-Projekt mit einfachen compile files('libs/volley.jar') importieren.

Vor kurzem hat Google jedoch Volley auf den Android Studio-Build-Stil aktualisiert, was die Erstellung eines Standalone-JAR erschwert. Sie können es immer noch tun, aber nur mit älteren Versionen der Bibliothek. Ich persönlich empfehle Ihnen, diese Option zu verwenden, auch wenn dies am schnellsten erscheint.

Sie sollten Volley auf die klassische Art und Weise einrichten, das heißt, indem Sie die Quelle als Modul importieren. Wählen Sie in Android Studio bei geöffnetem Projekt Datei > Neues Modul (File > New Module) und dann Vorhandenes Projekt importieren. Wählen Sie das Verzeichnis aus, in das Sie gerade den Quellcode heruntergeladen haben, und bestätigen Sie die Auswahl. Ein Ordner namens Volley wird in Ihrer Projektstruktur angezeigt. Android Studio aktualisiert automatisch die Datei settings.gradle, um das Volley-Modul einzubinden, sodass Sie Ihrem Abhängigkeiten-compile project (':volley') nur noch etwas hinzufügen müssen, und Sie sind fertig.

Es gibt einen dritten Weg. Sie können diese Zeile in den Abhängigkeitsabschnitt der Datei build.gradle einfügen:

Es handelt sich um eine Spiegelkopie des offiziellen Google-Repositorys, die regelmäßig synchronisiert und aktualisiert wird. Es ist wahrscheinlich der einfachste und schnellste Weg, um loszulegen. Beachten Sie jedoch, dass es sich um ein inoffizielles Maven-Repository handelt, das keine Garantien bietet und nicht von Google unterstützt wird.

Meiner Meinung nach ist es immer noch besser, einige Minuten in den offiziellen Quellcode zu investieren. Auf diese Weise können Sie problemlos zu den ursprünglichen Definitionen und Implementierungen springen, sodass Sie sich im Zweifelsfall jederzeit auf die offizielle Volley-Quelle verlassen können und diese gegebenenfalls ändern können.

Schritt 2: Volley-Verwendung

Volley arbeitet meistens mit nur zwei Klassen, RequestQueue und Request. Sie erstellen zunächst eine RequestQueue, die Arbeitsthreads verwaltet und die geparsten Ergebnisse an den Haupt-Thread zurückgibt. Sie übergeben dann ein oder mehrere Request-Objekte.

Der Request-Konstruktor verwendet als Parameter immer den Methodentyp (GET, POST usw.), die URL der Ressource und Ereignis-Listener. Je nach Art der Anforderung werden dann möglicherweise weitere Variablen abgefragt.

Im folgenden Beispiel erstelle ich ein RequestQueue-Objekt durch Aufrufen einer der bequemen Methoden von Volley, Volley.newRequestQueue. Dadurch wird ein RequestQueue-Objekt mit den von Volley definierten Standardwerten eingerichtet.

Wie Sie sehen, ist es unglaublich einfach. Sie erstellen die Anforderung und fügen sie der Anforderungswarteschlange hinzu. Und Sie sind fertig.

Beachten Sie, dass die Listener-Syntax AsyncTask.onPostExecute ähnlich ist. Sie wird einfach zu onResponse. Das ist kein Zufall. Die an Volley arbeitenden Entwickler haben die API der Bibliothek absichtlich den AsyncTask-Methoden ähnlich gemacht. Dies erleichtert den Übergang von der Verwendung von AsyncTask zu Volley.

Wenn Sie mehrere Anforderungen in mehreren Aktivitäten auslösen müssen, sollten Sie den oben genannten Ansatz Volley.newRequestQueue.add vermeiden. Es ist viel besser, eine gemeinsam genutzte Anforderungswarteschlange zu instanziieren und sie in Ihrem Projekt zu verwenden:

Wir werden im nächsten Tutorial dieser Serie genau so etwas entwickeln.

4. Legen Sie Ihre Hände in den Teig

Bearbeitung von Standardanforderungen

Volley eignet sich hervorragend für die Implementierung von drei sehr häufig vorkommenden Anfragetypen:

  • StringRequest
  • ImageRequest
  • JsonRequest

Jede dieser Klassen erweitert die Result-Klasse, die wir zuvor verwendet haben. Wir haben uns die StringRequest bereits im vorherigen Beispiel angesehen. Stattdessen sehen wir, wie ein JsonRequest funktioniert.

Wunderschön. Ist es nicht? Wie Sie sehen, ist der Ergebnistyp bereits auf JSONObject gesetzt. Sie können auch nach einem JSONArray fragen, wenn Sie möchten, indem Sie statt eines JsonObjectRequest einen JsonArrayRequest verwenden.

Wie zuvor ist der erste Parameter des Konstruktors die zu verwendende HTTP-Methode. Sie geben dann die URL an, von der der JSON abgerufen werden soll. Die dritte Variable im obigen Beispiel ist null. Das ist in Ordnung, da dies bedeutet, dass keine Parameter mit der Anforderung gepostet werden. Schließlich haben Sie den Listener, um die JSON-Antwort und einen Fehlerlistener zu erhalten. Sie können in null übergeben, wenn Sie Fehler ignorieren möchten.

Das Abrufen von Bildern erfordert etwas mehr Arbeit. Es gibt drei mögliche Methoden zum Anfordern eines Bildes. ImageRequest ist der Standard. Das angeforderte Bild wird in einer allgemeinen ImageView angezeigt und über eine bereitgestellte URL abgerufen. Alle Dekodierungs- und Größenänderungsvorgänge, die Volley ausführen soll, werden in einem Arbeitsthread ausgeführt. Die zweite Option ist die ImageLoader-Klasse, die Sie sich als Orchestrator für eine große Anzahl von ImageRequests vorstellen können, um beispielsweise eine ListView mit Bildern zu füllen. Die dritte Option ist NetworkImageView, eine Art XML-Ersatz für das ImageView-Layoutelement.

Schauen wir uns ein Beispiel an.

Der erste Parameter ist die URL des Bildes und der zweite ist der Listener für das Ergebnis. Der dritte und vierte Parameter sind Ganzzahlen, maxWidth und maxHeight. Sie können sie auf 0 setzen, um diese Parameter zu ignorieren. Danach fragt ImageRequest Sie nach dem ScaleType, der zur Berechnung der erforderlichen Bildgröße verwendet wird, und nach dem Format, in das die Bitmap dekodiert werden soll. Ich empfehle immer, Bitmap.Config.ARGB_8888 zu verwenden. Zum Schluss übergeben wir einen Fehlerlistener.

Beachten Sie, dass Volley die Priorität dieser Anforderung automatisch auf LOW setzt.

Eine POST-Anfrage stellen

Das Umschalten von einer GET-Anforderung zu einer POST-Anforderung ist einfach. Sie müssen Request.Method im Konstruktor der Anforderung ändern, die getParams-Methode überschreiben und eine korrekte Map<String, String> mit den Parametern der Anforderung zurückgeben.

Eine Anfrage abbrechen

Wenn Sie alle Ihre Anforderungen abbrechen möchten, fügen Sie der onStop-Methode den folgenden Code-Ausschnitt hinzu:

Auf diese Weise müssen Sie sich keine Gedanken darüber machen, dass der Benutzer die Aktivität bereits beim Aufruf von onResponse zerstört hat. In einem solchen Fall würde eine NullPointerException ausgelöst.

POST- und PUT-Anforderungen sollten jedoch auch dann fortgesetzt werden, wenn der Benutzer die Aktivitäten ändert. Wir können dies durch die Verwendung von Tags erreichen. Fügen Sie beim Erstellen einer GET-Anforderung ein Tag hinzu.

Um jede ausstehende GET-Anfrage abzubrechen, fügen wir einfach die folgende Codezeile hinzu:

Auf diese Weise stornieren Sie nur die GET-Anforderungen und lassen andere Anforderungen unberührt. Beachten Sie, dass Sie den Fall, in dem die Aktivität vorzeitig zerstört wird, manuell bearbeiten müssen.

Verwalten von Cookies und Anforderungsprioritäten

Volley bietet keine Methode zum Setzen der Cookies einer Anfrage oder deren Priorität. Es wird wahrscheinlich in Zukunft so sein, da es eine ernsthafte Auslassung ist. Vorerst müssen Sie jedoch die Request-Klasse erweitern.

Zum Verwalten von Cookies können Sie mit den Kopfzeilen der Anfrage spielen und die Methode getHeaders überschreiben:

Mit dieser Implementierung können Sie die Liste der Cookies mithilfe von setCookies direkt zur Anforderung bereitstellen.

Für die Priorität müssen Sie auch die Request-Klasse erweitern, indem Sie die getPriority-Methode überschreiben. So könnte die Implementierung aussehen:

Rufen Sie dann im Haupt-Thread diese Codezeile auf, um die Priorität der Anforderung festzulegen:

Sie können aus einem von vier möglichen Prioritätsstatus auswählen (sehen Sie unten):

Schlussfolgerung

In diesem Artikel haben wir untersucht, wie die Volley-Netzwerkbibliothek funktioniert. Wir haben zuerst gesehen, warum und wann es besser ist, Volley anstelle einer anderen bereits im Android SDK enthaltenen Lösung zu verwenden. Anschließend haben wir uns eingehend mit den Details der Bibliothek beschäftigt und uns den Arbeitslauf und die unterstützten Anforderungstypen angesehen. Schließlich haben wir uns die Hände schmutzig gemacht, indem wir einfache Anfragen erstellt und benutzerdefinierte für die Behandlung von Cookies und die Priorisierung implementiert haben.

Im nächsten Teil dieser Serie über Volley erstellen wir eine einfache Anwendung, die Volley nutzt. Ich zeige Ihnen, wie Sie eine Wetteranwendung für den Mars erstellen, und verwenden Sie dabei die Wetterdaten, die der Curiosity-Rover auf dem Mars erfasst.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.