2015-11-09 2 views
2

J'essaie d'obtenir Volley de travailler en utilisant son Cache. Lorsque je reçois un 304getCacheEntry().data est null même si "cache-control" est défini. Voici ce que je fais:Volley Cache renvoie null lors de la réception 304

  1. Volley obtient instancié aime ce

    // Instantiate the cache 
    Cache cache = new DiskBasedCache(c.getCacheDir(), 10 * 1024 * 1024); // 10 MB cap 
    
    // Set up the network to use HttpURLConnection as the HTTP client. 
    Network network = new BasicNetwork(new HurlStack()); 
    
    // Instantiate the RequestQueue with the cache and network. 
    mRequestQueue = new RequestQueue(cache, network); 
    
    // Start the queue 
    mRequestQueue.start(); 
    
  2. Après l'envoi d'une requête GET je reçois la réponse 200 avec "cache-control" ensemble à "max-age=180, public". Jusqu'ici tout va bien?

  3. Si une demande GET est effectuée deux fois ou plus, j'ai défini "If-Modified-Since" avec le dernier horodatage de la demande à l'en-tête de la demande.
  4. La deuxième fois que je demande un point de terminaison API spécifique, le serveur répond avec un 304. getCacheEntry().data renvoie cependant null. Si je vérifie le cache entries dans VolleysRequestQueue je ne peux pas trouver une entrée pour ma demande spécifique.

Qu'est-ce que je fais mal? Pour une raison quelconque, j'ai une requête qui est toujours mise en cache une fois déclenchée. C'est même un qui renvoie beaucoup de données. Mais toutes les autres demandes ne sont pas mises en cache. L'extrait de code suivant analyse la réponse et vérifie 304.

@Override 
protected Response<T> parseNetworkResponse(NetworkResponse response, String charset) { 
    try { 
     String json = ""; 
     if (!response.notModified) { 
      json = new String(response.data, charset); 
     } else { 
      //if not modified -> strangely getCacheEntry().data always null 
      json = new String(getCacheEntry().data, charset); 
     } 
     return Response.success(
       gson.fromJson(json, clazz), 
       HttpHeaderParser.parseCacheHeaders(response)); 

    } catch (UnsupportedEncodingException e) { 
     return Response.error(new ParseError(e)); 
    } catch (JsonSyntaxException e) { 
     return Response.error(new ParseError(e)); 
    } 
} 

J'apprécie vraiment tous les commentaires à ce sujet.

+0

Si votre demande est une demande POST, IMO, vous pouvez lire ce qui suit http://stackoverflow.com/questions/21953519/volley-exception-error-when-response-code-304-and-200 – BNK

+0

Merci @BNK C'est une demande GET si – Ben

+0

Si le serveur est publié dans Internet, pls poster l'URL afin que je puisse vérifier demain – BNK

Répondre

0

à mon humble avis, l'entrée de votre cache est toujours nul (non seulement lors de l'obtention 304 du code resp), en raison des éléments suivants:

Cache cache = new DiskBasedCache(c.getCacheDir(), 10 * 1024 * 1024); // 10 MB cap 

S'il vous plaît vérifier votre c.getCacheDir() pour voir si vous souhaitez utiliser de stockage externe pour stocker le cache données, alors vous devez définir la permission WRITE_EXTERNAL_STORAGE à l'intérieur du fichier AndroidManifest.xml.

Espérons que cela aide!

+0

J'ai résolu ce problème! 'WRITE_EXTERNAL_STORAGE' est défini dans' AndroidManifest.xml'. Mais dans une ancienne classe, nous avons généré un nouveau 'RequestQueue' pour une raison étrange ... maintenant ça marche. Merci de votre aide!! – Ben