swirl logo

About     Archive     Feed     Impressum

Android: Volley Tutorial

Hintergrund

Google hat kürzlich eine neue Library namens Android Volley vorgestellt, die zum Ziel hat, auf möglichst einfache Weise effektive Netzwerkoperationen durchzuführen.

Setup

Das Setup ist recht einfach. Es muss lediglich das Volley Projekt geklont werden um anschließend in ein Projekt kopiert zu werden.

Schlüsselklassen

Folgend eine Auflistung der essentiellen Klassen von Android Volley mit deren Bedeutung:

Erste Schritte

Vorbereitung

Zuerst gilt es eine RequestQueue zu erzeugen, die idealerweise in der gesamten Applikation lediglich einmal existiert:

RequestQueue queue = Volley.newRequestQueue(myContext);

GET-Requests

GET-Requests lassen sich mit Volley sehr einfach durchführen. Das folgige Beispiel verwendet ein JsonObjectRequest, welches folgende vier Parameter erwartet:

final String url = "http://httpbin.org/get?param1=test";

// 
JsonObjectRequest getRequest = new JsonObjectRequest(Request.Method.GET, url, null,
    new Response.Listener<JSONObject>() 
    {
        @Override
        public void onResponse(JSONObject response) {    
                        // display response        
            Log.d("Response", response.toString());
        }
    }, 
    new Response.ErrorListener() 
    {
         @Override
         public void onErrorResponse(VolleyError error) {             
            Log.d("Error.Response", response);
       }
    }
);

// Zur Request-Queue hinzufügen
queue.add(getRequest);

Post-Requests

Bei Post-Requests gilt es die Methode getParams zu überschreiben. Diese erwartet als Rückgabe eine Map gefüllt mit Key-Value Werten, die in den Request aufgenommen werden sollen:

url = "http://httpbin.org/post";
StringRequest postRequest = new StringRequest(Request.Method.POST, url, 
    new Response.Listener<String>() 
    {
        @Override
        public void onResponse(String response) {
            // response
            Log.d("Response", response);
        }
    }, 
    new Response.ErrorListener() 
    {
         @Override
         public void onErrorResponse(VolleyError error) {
             // error
             Log.d("Error.Response", response);
       }
    }
) {       
    @Override
    protected Map<String, String> getParams() 
    {  
            Map<String, String>  params = new HashMap<String, String>();  
            params.put("user", "42");  
            params.put("name", "Bruce");
            
            return params;  
    }
};
queue.add(postRequest);

Put-Requests

Put-Requests verhalten sich prinzipiell analog dem Post-Request:

url = "http://httpbin.org/put";
StringRequest putRequest = new StringRequest(Request.Method.PUT, url, 
    new Response.Listener<String>() 
    {
        @Override
        public void onResponse(String response) {
            // response
            Log.d("Response", response);
        }
    }, 
    new Response.ErrorListener() 
    {
         @Override
         public void onErrorResponse(VolleyError error) {
                         // error
             Log.d("Error.Response", response);
       }
    }
) {

    @Override
    protected Map<String, String> getParams() 
    {  
            Map<String, String>  params = new HashMap<String, String> ();  
            params.put("user", "42");  
            params.put("name", "Bruce");
            
            return params;  
    }

};

queue.add(putRequest);

Delete-Requests

Delete-Requests sind denkbar einfach. Neben der zu löschenden Ressource wird keinerlei weitere Angabe benötigt:

url = "http://httpbin.org/delete";
StringRequest dr = new StringRequest(Request.Method.DELETE, url, 
    new Response.Listener<String>() 
    {
        @Override
        public void onResponse(String response) {
            // response
            Toast.makeText($this, response, Toast.LENGTH_LONG).show();
        }
    }, 
    new Response.ErrorListener() 
    {
         @Override
         public void onErrorResponse(VolleyError error) {
             // error.
             
       }
    }
);
queue.add(dr);

Request-Priorisierung

Erfordert die Anwendung die parallele Verarbeitung mehrerer Request, so kann es sinnvoll sein, diese entsprechend deren Bedeutung zu priorisieren. Dank der Anpassbarkeit von Volley gelingt dieses Ziel recht schnell mit Erstellung einer eigenen Request-Klasse:

public class CustomStringRequest extends StringRequest {
 private Priority priority = Priority.LOW;

  CustomStringRequest(String url, Listener<string>listener,ErrorListener errorListener) {
    super(url, listener, errorListener);
  }

  @Override
  public Priority getPriority(){
    return priority;
 }

 public void setPriority(Priority priority){
    this.priority = priority;
 }
}

Per Default wird die Priorität auf "Low" gesetzt. Diese lässt sich mit Aufruf der setPriority-Methode anpassen:

Request.setPriority(Priority.IMMEDIATE)
Hire me!