Android 排球图书馆:我们总是要重复Response.Listener和Response.ErrorListener吗
Android Volley library: do we always have to repeat Response.Listener and Response.ErrorListener
我最近开始在我的项目中使用 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.
}
});
我的问题是 - 我们是否必须在需要发出请求的任何地方重复此代码。我试图通过创建一个助手 class :
来放入一个通用的 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 在一个地方。
谁能告诉我实现这样的目标的最佳方法是什么。
创建一个 class(如 "ApiManager"),您传递 url 和参数,创建 Volley 请求并跟踪回复和侦听器。 ApiManager 通常会从调用 class 中获得回调以获取结果。这样,您只需输入一次 Volley 代码,而每次调用的逻辑都会很简洁。或者,我就是这样做的。
您可以参考我的示例代码如下:
public interface VolleyResponseListener {
void onError(String message);
void onResponse(Object response);
}
然后在我的 VolleyUtils class:
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);
}
然后在 Activity:
VolleyUtils.makeJsonObjectRequest(mContext, url, new VolleyResponseListener() {
@Override
public void onError(String message) {
}
@Override
public void onResponse(Object response) {
}
});
另一种方法是创建一个 VolleyResponseListener 变量,然后将其传递给 VolleyUtils class 的方法,作为我在以下问题中的回答:
希望对您有所帮助!
我最近开始在我的项目中使用 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.
}
});
我的问题是 - 我们是否必须在需要发出请求的任何地方重复此代码。我试图通过创建一个助手 class :
来放入一个通用的 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 在一个地方。
谁能告诉我实现这样的目标的最佳方法是什么。
创建一个 class(如 "ApiManager"),您传递 url 和参数,创建 Volley 请求并跟踪回复和侦听器。 ApiManager 通常会从调用 class 中获得回调以获取结果。这样,您只需输入一次 Volley 代码,而每次调用的逻辑都会很简洁。或者,我就是这样做的。
您可以参考我的示例代码如下:
public interface VolleyResponseListener {
void onError(String message);
void onResponse(Object response);
}
然后在我的 VolleyUtils class:
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);
}
然后在 Activity:
VolleyUtils.makeJsonObjectRequest(mContext, url, new VolleyResponseListener() {
@Override
public void onError(String message) {
}
@Override
public void onResponse(Object response) {
}
});
另一种方法是创建一个 VolleyResponseListener 变量,然后将其传递给 VolleyUtils class 的方法,作为我在以下问题中的回答:
希望对您有所帮助!