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

时间:2014-01-29 14:23:30

标签: android caching asynchronous android-volley

我在应用程序中有很多以截击方式完成的字符串请求。在每个模块中都有一个不同的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


                }

            } 
        }
    }

3 个答案:

答案 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) {
         //...
       }
    }
);