我在应用程序中有很多以截击方式完成的字符串请求。在每个模块中都有一个不同的onResponseListener,总是做一些不同的事情。我需要让它们也能脱机工作。所以我从缓存中获得响应。问题是可能有很多请求与不同的url异步调用。问题是当从缓存中获取请求时如何记住请求的URL。目前它只在全局变量中,但由于请求可以异步发送,因此响应可能与全局变量url不匹配。有没有办法如何在onResponse中获取此请求的原始请求URL并直接在Application.get()。getApi()。getCache( url )中使用它?
请求看起来总是这样:
Application.get().getApi().getRequest(url, mListener);
mListener:
private class ResponseListenerX extends Api.ResponseListener {
@Override
public void onResponse(String response) {
if (response != null) {
}
}
@Override
public void onErrorResponse(VolleyError error) {
if ((error == null || error.networkResponse == null) && url != null) {
// how to get here url from the request
String response = Application.get().getApi().getCache(url);
if (response != null && response.length() > 0) {
// onResponse
}
}
}
}
答案 0 :(得分:1)
所以最好的解决方案是使用凌空延伸:eu.the4thfloor.volleyextended 有更新的响应侦听器,您可以在其中获得其他布尔值更改,这意味着响应与缓存中的最后一个响应不同。
在错误响应时,还有其他参数响应,您可以在服务器或网络外出时使用它。当然,如果它只是缓存。
private class ResponseListenerYYY extends Api.ResponseListener {
@Override
public void onResponse(String response, boolean changed) {
}
@Override
public void onErrorResponse(VolleyError error, String response) {
}
}
答案 1 :(得分:0)
您可以在Listener中创建一个私有变量,然后再引用它:
Application.get().getApi().getRequest(url, new ResponseListenerX(url));
private class ResponseListenerX extends Api.ResponseListener {
private String requestedUrl;
public ResponseListenerX(String requestedUrl) {
this.requestedUrl = requestedUrl;
}
@Override
public void onResponse(String response) {
if (response != null) {
}
}
@Override
public void onErrorResponse(VolleyError error) {
if ((error == null || error.networkResponse == null) && url != null) {
// how to get here url from the request
String response = Application.get().getApi().getCache(requestedUrl);
if (response != null && response.length() > 0) {
// onResponse
}
}
}
}
答案 2 :(得分:0)
如果您在每个请求上创建新的侦听器实例,那么您将是唯一的:
StringRequest request = new StringRequest(Request.Method.GET, url, null,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
//...
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//...
}
}
);