2014-01-29 61 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) { 
     //... 
     } 
    } 
);