如何包装 JsonObjectRequest 和 Volley 更易于使用?

How to wrap JsonObjectRequest and Volley to be simpler to use?

我想向 API 发送请求并在 Android 中获得 JSON 格式的响应。我使用 Volley 来帮助我。我打算将 JsonObjectRequest 包装在 VolleyHelper 中,以方便我使用它。问题是 JsonObjectRequest 的 onResponse() 是无效的,所以我不能 return JSON 对象。我的想法是让我的 api 调用像这样简单。

JSONObject response = VolleyHelper.getInstance(this).get(url);

JSONObject response = VolleyHelper.getInstance(this).post(url, params);

下面是我的帮助程序代码,按照 Google 的建议使用单例模式。

排球助手

public class VolleyHelper {
    private static VolleyHelper mInstance;
    private RequestQueue mRequestQueue;
    private static Context mCtx;

    public static synchronized VolleyHelper getInstance(Context context) {
        if (mInstance == null) {
            mInstance = new VolleyHelper(context);
        }
        return mInstance;
    }

    private VolleyHelper(Context context) {
        mCtx = context;
        mRequestQueue = getRequestQueue();
    }

    private RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
        }
        return mRequestQueue;
    }

    private <T> void addToRequestQueue(Request<T> req) {
        getRequestQueue().add(req);
    }

    public JSONObject get(String url) {

        JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject jsonObject) {
                //return jsonObject;
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                //return jsonerror
            }
        });

        addToRequestQueue(request);
    }

    public JSONObject post(String url, Map<String, String> params) {

        JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject jsonObject) {
                //return jsonObject;
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                //return jsonerror
            }
        }) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                return params;
            }
        };

        addToRequestQueue(request);
    }
}

我认为同步地 return 异步操作中的任何内容都不是一个好主意。 android 中的整个异步层——无论是普通的 AsyncTask 还是 Volley——都是用另一种模式构建的 -> callback。在这种情况下,回调是在 "long-running" 网络任务完成时调用的。

所以,你应该设计你的助手 class 这样:

public interface OnFinishListener { public void onFinish( JSONObject o ); }

public class VolleyHelper {

    public JSONObject get(String url, OnFinishListener ofl ) {

        JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject jsonObject) {
                ofl.onFinish( jsonObject );
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                //return jsonerror
            }
        });

        addToRequestQueue(request);
    }
}

然后:

OnFinishListener ofl = new OnFinishListener(){
  @Override public void onFinish( JSONObject o ){
    doSomethingOnJson( o );
  }
}
JSONObject response = VolleyHelper.getInstance(this).get(url, ofl );

JSONObject response = VolleyHelper.getInstance(this).post(url, params, ofl );