2015-09-19 24 views
7

我最近開始在我的項目中使用Android Volley。 在大多數教程中提到的常見的做法是使用這種方式:Android排球庫:我們總是需要重複Response.Listener和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. 
       } 
      }); 

我的查詢是 - 我們不得不重複這個代碼的每一個地方的地方,我們需要做的請求。我試圖把在一個共同的onResponse和onErrorResponse處理程序通過創建一個輔助類:

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

但是這種方法的問題是,我需要在每一個東西來傳遞在構造函數本身,這使得我覺得我沒有正確地做。例如,如果我需要傳遞url的一些查詢參數,我需要始終傳遞來自調用者的完整url,儘管我仍然可以在一個地方生成url。

有人可以讓我知道什麼是實現這樣的事情的最佳方式。

回答

14

你可以參考我的示例代碼如下所示:

public interface VolleyResponseListener { 
    void onError(String message); 

    void onResponse(Object response); 
} 

然後在我的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); 
} 

然後在活動:

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

     } 

     @Override 
     public void onResponse(Object response) { 

     } 
    }); 

另一種方式是創建一個VolleyResponseListener變量,然後將它傳遞給方法VolleyUtils類,如我在以下問題的答案:

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

希望這有助於!

+0

感謝您的迴應!另一個蹩腳的查詢 - 我可以在接口方法中使用通用功能嗎?所以我只在需要的時候覆蓋他們。 – pankaj

+0

@pankaj爲可選方法,國際海事組織,你應該閱讀[這個問題](http://stackoverflow.com/questions/5278013/optional-method-in-java-interface) – BNK

+0

我認爲有一個誤解。我的問題是關於保持一個常見的onResponse()例程,所以我不需要在所有活動中提供onResponse()。即使使用接口,我也需要在活動中始終提供自定義響應處理程序。甚至可以朝這個方向思考是否可以? – pankaj

0

創建一個類(如「ApiManager」),您可以傳遞url和參數,創建Volley請求並跟蹤回覆和偵聽器。 ApiManager通常會從調用類中獲取結果的回調。這樣,您只需鍵入一次Volley代碼,而每次調用的邏輯將會簡潔。或者,我就是這麼做的。

+1

你會介意粘貼一些你使用的方法的骨架/代碼.. – pankaj

相關問題