Android Volley库:我们总是要重复Response.Listener和Response.ErrorListener

pan*_*kaj 7 android android-volley

我最近开始在我的项目中使用Android Volley.大多数教程中提到的常见做法是以这种方式使用它:

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.
                }
            });
Run Code Online (Sandbox Code Playgroud)

我的疑问是 - 我们是否必须在我们需要提出请求的任何地方重复此代码.我试图通过创建一个辅助类来放入一个共同的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
            });
}
Run Code Online (Sandbox Code Playgroud)

但是这种方法的问题在于我需要传递构造函数本身的每一件事,这让我觉得我没有正确地做到这一点.例如,如果我需要为url传递一些查询参数,我需要始终从调用者传入完整的url,尽管我仍然可以在一个地方生成一个通用逻辑来生成url.

有人可以让我知道实现这样的事情的最佳方法是什么.

BNK*_*BNK 15

您可以参考我的示例代码,如下所示:

public interface VolleyResponseListener {
    void onError(String message);

    void onResponse(Object response);
}
Run Code Online (Sandbox Code Playgroud)

然后在我的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);
}
Run Code Online (Sandbox Code Playgroud)

然后在活动中:

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

        }

        @Override
        public void onResponse(Object response) {

        }
    });
Run Code Online (Sandbox Code Playgroud)

另一种方法是创建一个VolleyResponseListener变量,然后将其传递给VolleyUtils类的方法,作为我在以下问题中的答案:

Android:如何从使用Volley的方法返回异步JSONObject?

希望这可以帮助!