android volley缓存异步请求-如何在ResponseListener中获取请求的url

android volley缓存异步请求-如何在ResponseListener中获取请求的url,android,caching,asynchronous,android-volley,Android,Caching,Asynchronous,Android Volley,我在应用程序中有大量的字符串请求。在每个模块中,都有一个不同的onResponseListener,总是做不同的事情。我需要让他们离线工作。所以我从缓存中得到了响应。问题是,可以使用不同的url异步调用许多请求。问题是如何在从缓存获取请求时记住该请求的url。目前它仅在全局变量中,但由于可以异步发送请求,所以响应可能与全局变量url不匹配。是否有某种方法可以在onResponse中获取此请求的原始请求url,并直接在Application.get().getApi().getCache(url)

我在应用程序中有大量的字符串请求。在每个模块中,都有一个不同的onResponseListener,总是做不同的事情。我需要让他们离线工作。所以我从缓存中得到了响应。问题是,可以使用不同的url异步调用许多请求。问题是如何在从缓存获取请求时记住该请求的url。目前它仅在全局变量中,但由于可以异步发送请求,所以响应可能与全局变量url不匹配。是否有某种方法可以在onResponse中获取此请求的原始请求url,并直接在Application.get().getApi().getCache(url)中使用它

请求看起来总是这样的:

Application.get().getApi().getRequest(url, 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


                }

            } 
        }
    }

您可以在侦听器中创建一个私有变量,然后在以后引用它:

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


                }

            } 
        }
    }

因此,最好的解决方案是使用截击扩展: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) {


    }
}

如果在每个请求上创建新的侦听器实例,则您是唯一的:

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) {
         //...
       }
    }
);
StringRequest-request=new-StringRequest(request.Method.GET,url,null,
新的Response.Listener(){
@凌驾
公共void onResponse(字符串响应){
//...
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
//...
}
}
);