web-dev-qa-db-fra.com

Comment vider le cache de volée automatiquement?

Je veux effacer la file d'attente de demandes toutes les 30 minutes par exemple.

Alors, quel est le meilleur moyen de vider le cache de volée automatiquement?

Ignorer les méthodes en élargissant la classe de cache de volée?

Ou construire une minuterie qui effacera le cache chaque fois que j'ai besoin?

11
JohnnyBeGoody

Google Volley propose deux méthodes pour effacer un élément du cache:

AppController.getInstance().getRequestQueue().getCache().remove(key);

et

AppController.getInstance().getRequestQueue().getCache().invalidate(key, fullExpire);

Supprimer signifie que vous supprimez les données en cache réelles.

Invalide signifie que vous marquez simplement les données comme non valides. Donc volley vérifiera avec le serveur si les données sont toujours valables. Le full expire détermine si les données doivent être utilisées avant volley les a validées avec le serveur.

Pour effacer le cache toutes les 30 minutes, utilisez le code ci-dessous: -

vous pouvez utiliser volley serverDate pour obtenir la date à laquelle la réponse a été reçue à l’origine

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

Donc, dans votre code, utilisez getMinutesDifference function as

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

            return  diffMinutes;
        }

et Appelez cette fonction dans votre code en tant que

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, true);
}

Cela invalidera le cache si la réponse précédente est> = 30 minutes.

19
Giru Bhai

Un moyen facile de le faire est de remplacer la méthode onRequestFinished et d'effacer le cache. Ou vous pouvez exécuter à l'intérieur de la minuterie après 30 min.

final RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);

requestQueue.addRequestFinishedListener(new RequestQueue.RequestFinishedListener<Object>() {
            @Override
            public void onRequestFinished(Request<Object> request) {
                requestQueue.getCache().clear();
            }
        });
0

J'essayais de supprimer le bitmap du cache en utilisant remove(key) mais cela ne fonctionnait pas, donc j'ai vérifier l'url reçue par putBitmap(String url, Bitmap bitmap). J'ai trouvé que l'url a un préfixe comme #W0#H#S7http... c'est parce que l'appel de volley est getCacheKey(String url, int maxWidth, int maxHeight, ScaleType scaleType) pour chaque url. SO si vous souhaitez supprimer l'URL du cache, vous devez également appeler cette fonction pour obtenir la clé de l'URL.

 String key = mImageLoader.getCacheKey(url, 0, 0, ImageView.ScaleType.CENTER_INSIDE);

 mRequestQueue.getCache().remove(key);

Passez 0,0 and ImageView.ScaleType.CENTER_INSIDE si vous utilisez imageLoader.get(String requestUrl,ImageLoader.ImageListener listener) sinon passez au minimum hauteur, largeur et type d’échelle que vous utilisez.

NOTEgetCacheKey() est une fonction privée de la classe ImageLoader, vous devez donc la changer en public pour pouvoir l'utiliser dans votre application.

0
Jaiprakash Soni