2014-06-30 2 views
3

Je n'ai pas trouvé de réponse mise à jour pour cela. J'envoie des demandes avec Volley à une API Web. Il renvoie JSON. J'utilise la fonction de cache comme ci-dessous, mais je voudrais m'assurer que la listview est rafraichie de temps en temps (disons 30 minutes pour le moment). Comment puis-je invalider le cache pour cette URL donnée afin que mon application le gère automatiquement (sans bouton Actualiser)? Ce question a été utile en soulignant la différence entre invalider et supprimer.Android Volley, invalider le cache et faire une nouvelle demande toutes les (x) minutes

MainActivity.java

Cache cache = AppController.getInstance().getRequestQueue().getCache(); 
     Entry entry = cache.get(URL_FEED); 
     if (entry != null) { 
      // fetch the data from cache 
      try { 
       String data = new String(entry.data, "UTF-8"); 
       try { 
        parseJsonFeed(new JSONArray(data)); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } catch (UnsupportedEncodingException e) { 
       e.printStackTrace(); 
      } 

     } else 
     { 
      // making fresh volley request and getting json 

      JsonArrayRequest getRequest = new JsonArrayRequest(URL_FEED, 
        new Response.Listener<JSONArray>() 
        { 
         @Override public void onResponse(JSONArray response) { 
          VolleyLog.d(TAG, "Response: " + response.toString()); 
          if (response != null) { 
           parseJsonFeed(response); 
          } 
          Log.d("Response", response.toString()); 
         } 
        },......ErrorListener 

Répondre

4

Pour rafraîchir ListView, vous pouvez utiliser serverDate de volley pour obtenir la date quand la réponse a été reçue comme

AppController.getInstance().getRequestQueue().getCache().get(url).serverDate 

ce datetime retour longtemps. Et dans votre fonction utilisation de code minutedifference comme

public static long getMinutesDifference(long timeStart,long timeStop){ 
      long diff = timeStop - timeStart; 
      long diffMinutes = diff/(60 * 1000); 

      return diffMinutes; 
     } 

et appeler cette fonction dans votre code comme

Calendar calendar = Calendar.getInstance(); 
long serverDate = AppController.getInstance().getRequestQueue().getCache().get(url).serverDate; 
if(getMinutesDifference(serverDate, calendar.getTimeInMillis()) >=30){ 
    AppController.getInstance().getRequestQueue().getCache().invalidate(URL_FEED, true); 
} 

Il annulera le cache, si la réponse précédente url> = 30 minutes.

Cette (invalider) permet de continuer à utiliser ces données jusqu'à ce qu'un nouvel appel soit effectué et que la réponse mise en cache soit remplacée par la nouvelle réponse.

+0

cela ne fonctionne pas correctement. – JosephM

+0

@HemsLodha que voulez-vous dire par ne pas fonctionner correctement? S'il vous plaît élaborer. –

+0

il y avait problème à mon extrémité ses travaux maintenant merci @Giru Bhai. mais le cache doit expirer dans un laps de temps lorsque nous demandons des données du serveur à travers les en-têtes de volée. c'est possible ? si oui alors comment? – JosephM

Questions connexes