2016-03-29 6 views
0

Ich möchte volley die vom Server erhaltene Antwort zwischenspeichern. Daher habe ich den Caching-Code (ParseNetworkResponse) implementiert. Aber Volley sendet zwischengespeicherte Parameter, wenn eine POST-Anfrage gemacht wird. Wie kann man verhindern, dass Volley das tut? Wie sollte der Caching-Code im Folgenden geändert werden, um das Zwischenspeichern von POST-Parametern zu stoppen? Ich möchte nur die Antwort vom Server zwischengespeichert werden.Verhindern, dass Volley zwischengespeicherte Parameter für die POST-Anforderungsmethode sendet, wenn Caching in Volley implementiert wird

 public NetworkConnector(final Context ctx, String url, String methodType, final ArrayList<ArrayList<String>> postData, 
         final RequestCompleteListener<String> listener) { 
    //postData has new data whenever class called 
    if (methodType.equals("POST")) { 
     method = Request.Method.POST; 
    } else if (methodType.equals("GET")) { 
     method = Request.Method.GET; 
    } 

    VolleySingleton volleySingleton = VolleySingleton.getInstance(); 
    requestQueue = volleySingleton.getRequestQueue(); 

    StringRequest stringRequest = new StringRequest(method, url, 
      new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 
        listener.onRequestExecuted("response", response); 
       } 
      }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        Log.d("CCC", "Error " + error.toString()); 

       } 
      }) 
    { 
     @Override 
     protected Map<String, String> getParams() throws AuthFailureError { 
      Map<String, String> params = new HashMap<>(); 
      for (int i = 0; i < postData.size(); i++) { 
       params.put(postData.get(i).get(0), postData.get(i).get(1)); 
       //postData sends old data here 
       //so a hashmap is consists of old values 
      } 
      return params; 
     } 

     @Override 
     protected Response<String> parseNetworkResponse(NetworkResponse response) { 
      try { 
       Cache.Entry cacheEntry = HttpHeaderParser.parseCacheHeaders(response); 
       if (cacheEntry == null) { 
        cacheEntry = new Cache.Entry(); 
       } 
       final long cacheHitButRefreshed = 3 * 60 * 1000; // in 3 minutes cache will be hit, but also refreshed on background 
       final long cacheExpired = 24 * 60 * 60 * 1000; // in 24 hours this cache entry expires completely 
       long now = System.currentTimeMillis(); 
       final long softExpire = now + cacheHitButRefreshed; 
       final long ttl = now + cacheExpired; 
       cacheEntry.data = response.data; 
       cacheEntry.softTtl = softExpire; 
       cacheEntry.ttl = ttl; 
       String headerValue; 
       headerValue = response.headers.get("Date"); 
       if (headerValue != null) { 
        cacheEntry.serverDate = HttpHeaderParser.parseDateAsEpoch(headerValue); 
       } 
       headerValue = response.headers.get("Last-Modified"); 
       if (headerValue != null) { 
        cacheEntry.lastModified = HttpHeaderParser.parseDateAsEpoch(headerValue); 
       } 
       cacheEntry.responseHeaders = response.headers; 
       final String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); 
       return Response.success(jsonString, cacheEntry); 
      } catch (UnsupportedEncodingException e) { 
       return Response.error(new ParseError(e)); 
      } 
     } 

     @Override 
     protected void deliverResponse(String response) { 
      super.deliverResponse(response); 
     } 

     @Override 
     public void deliverError(VolleyError error) { 
      super.deliverError(error); 
     } 

     @Override 
     protected VolleyError parseNetworkError(VolleyError volleyError) { 
      return super.parseNetworkError(volleyError); 
     } 
    }; 
    requestQueue.add(stringRequest); 
} 

Antwort

0

ist keine Lösung für das Problem, aber dieses Problem zu umgehen:

currentURL = url; 
if (methodType.equals("POST")) { 
    currentURL = currentURL + "?timestamp=" + String.valueOf(System.currentTimeMillis()); 
} 

hier ein Dummy-Parameter, den Zeitstempel wird auf die Website gesendet werden. Die Website verwendet diesen Parameter nicht und ändert daher nichts. Es stellt nur eine eindeutige URL zur Verfügung, um jedes Mal, wenn eine Post-Anfrage ausgeführt wird. Nach der Periode des Cache-Speichers, d. H. 24 Stunden in meinem Fall, werden die zwischengespeicherten Daten für die URL mit dem Zeitstempel gelöscht, daher wird der Cache nicht aufgebaut.

Hinweis: Diese Problemumgehung wird nicht für URLs empfohlen, bei denen große Datenmengen gesendet oder empfangen werden und große Mengen an Postanforderungen an die URL erfolgen, da der Cache möglicherweise voll wird.

0

in Volley-Standardnetzwerkimplementierung BasicNetwork Sie die folloin Linie auf performRequest haben (96):

addCacheHeaders (Header, request.getCacheEntry());

Dies ist der Grund, warum Sie dieses Verhalten haben. Wenn Sie also einen Cache-Eintrag erstellen und gleichzeitig keinen senden möchten, müssen Sie Ihre eigene Implementierung erstellen/'CustomCacheNetwork' kopieren und diese Zeile für Ihre POST-Anfragen ersetzen.

dann müssen Sie Ihre Warteschlange wie diese erstellen:

Network network = new CustomCacheNetwork(stack); 
    RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network); 

Dieses Verhalten aber seltsam ist, weil, wenn Sie gültige Cache haben, werden Sie überhaupt nicht mit dem Netzwerk-Dispatcher gehen. Diese