2013-12-19 10 views
35

Ich habe einen Beitrag über Volley gelesen und ich weiß, dass es eine großartige Netzwerkbibliothek ist. Aber ich konnte eine Sache nicht verstehen.Volley und AsyncTask

Alle Anfrage ist async Aufgabe oder nicht?

wenn ich asyncTask Anfrage mit Volley senden möchte, muss ich Volley Anfrage in AsyncTask setzen? oder sollte ich nur Volley Request anrufen, es ist bereits AsyncTask Anfrage?

private class MyClass extends AsyncTask<String, Void, String> { 

     @Override 
     protected String doInBackground(String... params) { 
      // do Volley request 
     } 
} 

Ist das der richtige Ansatz?

+3

Es geschieht bereits im Hintergrund "asynchron". Sie brauchen * NICHT * AsyncTask' –

Antwort

52

Sie müssen keine Volly-Anforderung bei asynchroner Task ausführen.

Warum:

Sie verwalten alle netzwerkbezogenen Aufgabe auf separaten Thread. Wenn Sie sich das Bibliotheksprojekt genau anschauen, haben sie sich die asynchrone Aufgabe nicht vorgestellt. Aber sie intelligent alle Netzwerkaufgaben effizient behandeln.

prüfen RequestQueue.java Klasse in Volly Haupt Paket

hier ich java doc bin einfügen.

/** 
* A request dispatch queue with a thread pool of dispatchers. 
* 
* Calling {@link #add(Request)} will enqueue the given Request for dispatch, 
* resolving from either cache or network on a worker thread, and then delivering 
* a parsed response on the main thread. 
*/ 

Edited:

Bildung einer Anfrage:

Mit Volley, Netzwerk-Kommunikation wird durch die Request verwaltet. Die beste Methode, um die RequestQueue und alle ihre Tools, insbesondere den Cache, zu nutzen, besteht darin, sie einmal zu instantiieren und als Singleton beizubehalten. An diesem Punkt können Sie dann Anforderungen hinzufügen oder abbrechen, Anforderungen stoppen oder starten und auf die Antwort-Cache (s) zugreifen.

RequestQueue queue =Volley.newRequestQueue(this); 

Sobald die RequestQueue instanziiert wurde, muss eine Anfrage erstellt werden. Dies kann mit ein paar verschiedenen "out of the box" -Anforderungsklassen erfolgen, die in der Volley-Bibliothek enthalten sind, oder indem die Anfrageklasse von Volley in Ihre eigene benutzerdefinierte Anfrage erweitert wird. Die Anforderungsklassen, die bereits in Volley enthalten sind, sind eine String-Anfrage, JSON-Anfragen und eine Bildanfrage. Die meisten der in der Volley-Bibliothek enthaltenen Anforderungsklassen verwenden Konstruktoren ähnlich der folgenden.

Parameter werden in Konstruktor übergeben:

request (get, posten, löschen, ect) * JSONObject * -Ein optional Objekt, das mit Ihrer Anfrage Response veröffentlicht werden - Wohin Ihre Daten gehen, nachdem die Anfrage abgeschlossen ist ErrorListener - Was wird mitgeteilt, wenn ein Problem mit Ihrer Anfrage aufgetreten ist.

JsonObjectRequest request = JsonObjectRequest(Requestmethod, url, null, new ResponseListener(), new ErrorListener()); 

Listners erhalten Antwort:

erfolgreiche Antwort Listener

private class ResponseListener implements Response.Listener{ 
    @Override 
    public void onResponse(JSONObject response){ 

    } 
} 

Error Response Listener

private class ErrorListener implements Response.ErrorListener{ 
    @Override 
    public void onErrorResponse(VolleyError error){ 

    } 
} 

Fügen Sie Ihre Anfrage zu Request Queue, Rest von Everything voll wird für Sie behandeln.

machen Aufruf:

Jetzt, dass wir unsere Anfrage und Antwort Klassen haben wir bereit sind, die Anforderung an die Warteschlange hinzuzufügen und die Daten abrufen. Dazu fügen wir die Anfrage einfach der Warteschlange hinzu.

queue.add(request); 

Die Antwort oder der Fehler wird dann an die Antwort/Fehlerklassen geliefert, die wir in unserer Anfrage definiert haben. Sie können der Warteschlange so viele Anfragen gleichzeitig hinzufügen, und die Antworten werden an die entsprechenden Antwort-/Fehlerklassen gesendet.

+1

Ich bin nach einer sehr langen Pause (Jahre) wieder auf Android und ich installierte Android Studio, Googles offizielle Android IDE. Ich habe ein neues Projekt mit der E-Mail-/Passwort-Anmeldevorlage eingerichtet, und der Standardcode in der Anmeldeaktivität enthielt eine 'AsyncTask', in die Sie Ihre HTTP-Anfrage stellen sollten. Das verwirrte mich und es führte mich zu dieser Frage. Ich gehe davon aus, dass Google nicht vorhat, in diesem Fall Volley zu verwenden? – RTF

6

Wenn Sie Volley verwenden, müssen Sie sie nicht mit AsyncTask kombinieren. Es macht das Networking-Zeug in einem anderen Thread für Sie.

Here ist ein grundlegendes Beispiel für einen Netzwerkanruf mit Volley. Wie Sie sehen können, ist der gesamte Code nur in der Activity, ohne eine AsyncTask definieren zu müssen.

+6

Leider ist der Link in Ihrer Antwort gebrochen. –

+0

Was ist, wenn ich ein Bild hochlade, für mein Profilbild nach der Registrierung. Es gibt ein Beispiel Youtube Tutorial, dass er beide verwendet. – RoCk

1

Volley kann nicht innerhalb AsyncTask eingesetzt werden, da

Volley ist Hintergrund-Thread initiiert (s) auf ihrer eigenen, so dass die gesamten Netzwerkanforderungen werden den UI-Thread so in erster Linie Sie nicht mehr benötigen erweitern AsyncTask ausgeführt wird. Natürlich müssen Sie darauf achten, die laufenden Anfragen bei der Rotation abzubrechen oder wenn der Benutzer Ihre Aktivität beendet. Da Volley hauptsächlich für kleinere Netzwerkzwecke in Android verwendet wird (für den DownloadManager). Es funktioniert ähnlich wie die AsyncTask-Klasse. Implementieren Sie Singleton in Volley. Bilder können auch in Volley gesendet werden.