2015-09-19 14 views
7

Ho recentemente iniziato a utilizzare Android Volley nel mio progetto. La pratica comune di cui la maggior parte dei tutorial è quello di utilizzare in questo modo:Libreria Android Volley: dobbiamo sempre ripetere Response.Listener e Response.ErrorListener

JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.GET, 
      url, null, 
      new Response.Listener<JSONObject>() { 

       @Override 
       public void onResponse(JSONObject response) { 
        // do something 
       } 
      }, new Response.ErrorListener() { 

       @Override 
       public void onErrorResponse(VolleyError error) { 
        // do something. 
       } 
      }); 

La mia domanda è - Dobbiamo ripetere questo codice in ogni dove, ovunque abbiamo bisogno di fare una richiesta. Stavo cercando di mettere in un onResponse comune e gestore onErrorResponse con la creazione di una classe di supporto:

public class CustomJSONObjectRequest extends JsonObjectRequest { 
    private BaseResource resource; 
    private String queryId; 
    private String paramArgs; 

    public CustomJSONObjectRequest(int method, String url, JSONObject 
           jsonRequest, 
           Response.Listener<JSONObject> listener, 
           final Response.ErrorListener errorListener, 
           final Context ctx, 
           final BaseResource baseResource) { 
    super(method, url, jsonRequest, 
      new Response.Listener<JSONObject>() { 
       // some common code for all BaseResources 
      }, 
      new Response.ErrorListener() { 
       // some common code 
      }); 
} 

Ma il problema di questo approccio è che ho bisogno di passare in ogni cosa nel costruttore stesso, che sta facendo mi sento come se non lo stavo facendo correttamente. Ad esempio, se ho bisogno di passare alcuni parametri di query per l'url, ho bisogno di passare sempre l'url completo dal chiamante anche se posso ancora avere una logica comune per generare l'url in un unico posto.

Qualcuno può farmi sapere qual è il modo migliore per ottenere qualcosa di simile.

risposta

14

È possibile fare riferimento al mio codice di esempio come il seguente:

public interface VolleyResponseListener { 
    void onError(String message); 

    void onResponse(Object response); 
} 

Poi nella mia classe VolleyUtils:

public static void makeJsonObjectRequest(Context context, String url, final VolleyResponseListener listener) { 
     JsonObjectRequest jsonObjectRequest = new JsonObjectRequest 
       (url, null, new Response.Listener<JSONObject>() { 

       @Override 
       public void onResponse(JSONObject response) { 
        listener.onResponse(response); 
       } 
      }, new Response.ErrorListener() { 

       @Override 
       public void onErrorResponse(VolleyError error) { 
        listener.onError(error.toString()); 
       } 
      }) { 

     @Override 
     protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) { 
      try { 
       String jsonString = new String(response.data, 
         HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET)); 
       return Response.success(new JSONObject(jsonString), 
         HttpHeaderParser.parseCacheHeaders(response)); 
      } catch (UnsupportedEncodingException e) { 
       return Response.error(new ParseError(e)); 
      } catch (JSONException je) { 
       return Response.error(new ParseError(je)); 
      } 
     } 
    }; 

    // Access the RequestQueue through singleton class. 
    VolleySingleton.getInstance(context).addToRequestQueue(jsonObjectRequest); 
} 

Poi in attività:

VolleyUtils.makeJsonObjectRequest(mContext, url, new VolleyResponseListener() { 
     @Override 
     public void onError(String message) { 

     } 

     @Override 
     public void onResponse(Object response) { 

     } 
    }); 

Un altro modo è la creazione di una variabile VolleyResponseListener quindi passarla in metodi di VolleyUtils classe, come la mia risposta nella seguente domanda:

Android: How to return async JSONObject from method using Volley?

Spero che questo aiuti!

+0

Grazie per la risposta! Un'altra query zoppa: posso inserire funzionalità comuni nei metodi di interfaccia? In modo che li escluda solo quando necessario. – pankaj

+0

@pankaj per i metodi facoltativi, IMO, dovresti leggere [questa domanda] (http://stackoverflow.com/questions/5278013/optional-method-in-java-interface) – BNK

+0

Penso che ci sia un equivoco. La mia domanda riguarda il mantenimento di una routine onResponse() comune, quindi non è necessario fornire onResponse() in tutte le attività. Anche con l'interfaccia, ho bisogno di fornire sempre un gestore di risposta personalizzato nelle attività. Va bene anche solo pensare in quella direzione? – pankaj

0

Creare una classe (come "ApiManager") che si passa l'url ei parametri, che crea la richiesta Volley e tiene traccia delle risposte e degli ascoltatori. In genere, ApiManager ottiene una richiamata dalla classe chiamante per i risultati. In questo modo, devi digitare il codice Volley solo una volta, mentre la logica per ogni chiamata sarebbe concisa. O è così che lo faccio.

+1

Ti dispiacerebbe incollare qualche scheletro/codice per l'approccio che hai usato .. – pankaj

Problemi correlati