2014-01-29 63 views
0

我在应用程序中有很多在volley中完成的字符串请求。在每个模块中,有一个不同的onResponseListener总是做不同的事情。我需要让他们也离线工作。所以我得到缓存的响应。问题是,可能会有很多异步调用不同URL的请求。问题是如何从缓存中获取请求时记住请求的URL。目前它只在全局变量中,但由于请求可以异步发送,响应可能与全局变量url不匹配。有什么方法可以让onResponse请求的原始请求url,并直接在Application.get()。getApi()。getCache(url)中使用它?android volley缓存异步请求 - 如何在ResponseListener中获取请求的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 


       } 

      } 
     } 
    } 

回答

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) { 


    } 
} 
0

您可以创建监听器中的私有变量,然后再引用它:

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 


       } 

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