如何包装 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 );
我想向 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 );