2015-09-19 9 views
7

Niedawno zacząłem używać Android Volley w moim projekcie. Wspólna praktyka wspomniano w większości tutoriali jest wykorzystanie go w ten sposób:Biblioteka Android Volley: czy zawsze musimy powtórzyć Response.Listener i 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. 
       } 
      }); 

Moje zapytanie jest - Czy musimy powtórzyć ten kod wszędzie tam, gdzie musimy dokonać zamówienia. Starałem się umieścić we wspólnej onResponse i onErrorResponse obsługi tworząc klasę pomocniczą:

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 
      }); 
} 

ale problem z tym podejściem jest to, że muszę przejść w każdej rzeczy w samej konstruktora, co czyni czuję, że nie robię tego poprawnie. Na przykład, jeśli muszę przekazać niektóre parametry zapytania dla adresu URL, muszę zawsze przekazywać pełny adres URL od osoby dzwoniącej, chociaż nadal mogę mieć wspólną logikę do generowania adresu URL w jednym miejscu.

Czy ktoś może mi powiedzieć, jaki jest najlepszy sposób osiągnięcia czegoś takiego.

Odpowiedz

14

Można odwołać się do mojego przykładowy kod jak poniżej:

public interface VolleyResponseListener { 
    void onError(String message); 

    void onResponse(Object response); 
} 

Wtedy w mojej klasie 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); 
} 

Następnie w działalność:

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

     } 

     @Override 
     public void onResponse(Object response) { 

     } 
    }); 

Innym sposobem jest stworzenie zmienną VolleyResponseListener, która następnie przekazuje ją metodom VolleyUtils klasy, jako moją odpowiedź na następujące pytanie:

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

nadzieję, że to pomaga!

+0

Dzięki za odpowiedź! Kolejne lame zapytanie - czy mogę umieścić wspólną funkcjonalność w metodach interfejsu? Tak więc tylko je zastępuję w razie potrzeby. – pankaj

+0

@pankaj dla metod opcjonalnych, IMO, powinieneś przeczytać [to pytanie] (http://stackoverflow.com/questions/5278013/optional-method-in-java-interface) – BNK

+0

Myślę, że jest nieporozumienie. Moje pytanie dotyczy utrzymania wspólnej procedury onResponse(), więc nie muszę podawać onResponse() we wszystkich działaniach. Nawet z interfejsem muszę zawsze dostarczać niestandardową procedurę obsługi odpowiedzi w działaniach. Czy można nawet myśleć w tym kierunku? – pankaj

0

Utwórz klasę (np. "ApiManager"), w której przekazujesz adres URL i parametry, co tworzy żądanie Volley i śledzi odpowiedzi i słuchaczy. ApiManager zazwyczaj otrzymuje wywołanie zwrotne z klasy wywołującej dla wyników. W ten sposób musisz wpisać kod Volley tylko raz, a logika każdego połączenia będzie zwięzła. Albo tak to robię.

+1

Czy mógłbyś wkleić szkielet/kod dla podejścia, którego użyłeś .. – pankaj

Powiązane problemy