【发布时间】:2015-06-12 12:21:42
【问题描述】:
我正在比较 Volley Libs(我拥有的旧版本和最新的 here)
下面是用于实例化请求的内容(Request.java 类)
//旧代码
public Request(int method, String url, Response.ErrorListener listener,int requestCode) {
mMethod = method;
mUrl = url;
mErrorListener = listener;
mRequestCode = requestCode;
setRetryPolicy(new DefaultRetryPolicy());
mDefaultTrafficStatsTag = TextUtils.isEmpty(url) ? 0: Uri.parse(url).getHost().hashCode();
}
//当前代码
public Request(int method, String url, Response.ErrorListener listener) {
mMethod = method;
mUrl = url;
mIdentifier = createIdentifier(method, url);
mErrorListener = listener;
setRetryPolicy(new DefaultRetryPolicy());
mDefaultTrafficStatsTag = findDefaultTrafficStatsTag(url);
}
令我惊讶的是我一直在使用非常突出的东西。 requestCode 变量在新变量中缺失,我使用它来识别我的响应或错误属于哪个请求。
引入了一个新变量 mIdentifier,我认为它可能是替代品,但找不到任何相关信息。
另外,我发现在 Request 对象上使用了 setTag() 方法,但这只是为了取消请求,here。
任何关于我如何实现相同的 requestCode 事物或解决方法以在新代码中获得相同功能的建议或帮助都会很棒。
谢谢。 :)
示例:以下是响应和错误回调的处理方式。旧代码中缺少 type 参数。
//旧代码
/** Callback interface for delivering parsed responses. */
public interface Listener<T> {
/** Called when a response is received. */
public void onResponse(T response,int type);
/**
* On response headers.
*
* @param headers the headers
*/
public void onResponseHeaders(Map<String, String> headers,int type);
}
/** Callback interface for delivering error responses. */
public interface ErrorListener {
/**
* Callback method that an error has been occurred with the
* provided error code and optional user-readable message.
*/
public void onErrorResponse(VolleyError error,int type);
}
//当前代码
/** Callback interface for delivering parsed responses. */
public interface Listener<T> {
/** Called when a response is received. */
public void onResponse(T response);
}
/** Callback interface for delivering error responses. */
public interface ErrorListener {
/**
* Callback method that an error has been occurred with the
* provided error code and optional user-readable message.
*/
public void onErrorResponse(VolleyError error);
}
编辑(我希望在新代码中实现以下内容,而不是每次创建请求时都编写响应):
@Override
public void onResponse(Object response, int type) {
if (type == NetworkController.REQ_CODE_UPDATE_USER) {
//Update user
}else if(type == NetworkController.REQ_CODE_DELETE_USER){
//Delete User
}
}
【问题讨论】:
-
为什么需要
requestCode来识别请求? -
假设我在同一个屏幕上有两个请求,那么我将 request = new Request 以及整个响应和错误代码写在同一个地方。这我必须重复第二个请求。但是,使用 requestCode 我可以做的只是在调用请求时将上下文传递给响应参数,然后在实现响应侦听器后我将覆盖的 onResponse 方法中,如果 requestCode == 1st request 执行此操作,我可以执行此操作。希望你能在这里得到照片。
-
对我来说,您似乎想避免创建不同的侦听器实例
-
是的,你明白我的意思。
-
这样你就可以紧密耦合两个不相关的东西。好处 0. 每个不同的后端调用都有一个不同的 Listener