Invalider le cache de Picasso
Je charge une image de disque à l'aide de Picasso, par exemple, Picasso.with(ctx).load(new File("/path/to/image")).into(imageView)
, mais à chaque fois que j'enregistre une nouvelle image dans le fichier, et de me rafraîchir ImageView
, Picasso a toujours le bitmap en mémoire cache.
Est-il possible d'invalider le cache de Picasso?
- après
Picasso.with(getActivity()).invalidate(file);
comment puis-je cache encore?
Vous devez vous connecter pour publier un commentaire.
Dans les versions récentes de Picasso, il y a une nouvelle méthode pour l'invalider, sans aucune solution de contournement, donc je pense que la coutume PicassoTools classe mentionné plus tôt, est désormais obsolète dans ce cas
IllegalStateException
peut être levée. github.com/square/picasso/commit/...Picasso.with(imageView.getContext()).load(imageUrl).networkPolicy(NetworkPolicy.NO_CACHE).into(imageView);
comme invalidate() n'est pas claire, la mise en réseau de cacheEn fait, basé sur votre propre réponse, il y a un moyen plus facile de le faire sans un fork de la bibliothèque. Ajouter cette classe à la com.squareup.picasso paquet.
Car le cache est le package de visibilité, cette classe util pouvez effacer le cache pour vous. Vous avez juste à appeler:
Picasso.with(getApplication()).cache.clear();
ne fonctionne pas. Il serait beaucoup plus propre.Abandon de la mémoire cache et le cache disque de vérifier par indiquer politique de mémoire en drapeau: emoryPolicy.NO_CACHE et NetworkPolicy.NO_CACHE comme ci-dessous extrait de code:
Essayez d'utiliser:
Une autre option est de supprimer le répertoire de cache lui-même, par exemple sur l'application de démarrage:
où:
Qui supprime l'ensemble du répertoire de cache, ce qui est bien si vous voulez simuler la première utilisation de votre application. Si vous souhaitez supprimer le Picasso cache, ajouter "picasso-cache" pour le chemin d'accès.
Ce que vous pouvez faire si vous souhaitez supprimer tous les cache à la fois, est de créer un personnalisé
Picasso.LruCache
, et ensuite utiliser leclear
méthode.Voici un exemple:
Pour effacer le cache:
L'ordre de la recherche de l'image de Picasso est:
Mémoire cache -> Disque de cache -> Réseau
Il y a donc peu de scénario, nous avons besoin d'invalider le cache de Picasso:
1.Invalider le cache de la mémoire:
Solution: Effacer le cache de l'Url, Fichier, Uri si existent
.
2.Invalider le cache de la mémoire et du cache disque en Ligne
※remarque: en Ligne moyenne de mise à jour directement à ImageView
Utilisateur de cas: l'Image de mise à jour sur l'hôte distant
Solution: Abandonner l'image sur la mémoire cache et le cache disque alors demander de l'image sur l'hôte distant
-> Abandonner la mémoire cache et le cache disque
.
3.Invalider le cache de la mémoire et du cache disque Hors ligne
※ remarque: Hors ligne moyenne de mise à jour pas à jour pour ImageView, juste au fond de chercher de l'aide plus tard
Solution: récupérer uniquement
※Remarque: l'Utilisation de fetch() est bon, mais il consomme également des ressources réseau, veuillez donc les considérer avec soin, vérifier scénario 4 ci-dessous pour une meilleure solution
4.Invalider le cache de la mémoire et du cache disque Hors ligne si le cache disque est exister
Solution: Faut-vérification du disque en utilisant le paramètre: NetworkPolicy.Cache HORS connexion avant de chercher
Picasso est un incroyable libs, j'espère squareup va ajouter plus de commodité API pour gérer le cache dans un prochain avenir.
Vous pouvez effacer cache des images de picasso en définissant votre propre cache et effacer les que.
Ce code a été testé sur Picasso 2.5.0
Ne tourne pas en boucle jolie, mais cette approche a fixé mon problème avec le cache et Picasso. Seuls les utiliser quand vous voulez pour invalider le cache pour une URL spécifique, cette approche est lente et n'est probablement pas la bonne façon de faire mais qui fonctionne pour moi.
Une partie très importante est absent de la accepté de répondre ici. J'ai trouvé l'astuce ici: http://blogs.candoerz.com/question/124660/android-image-cache-is-not-clearing-in-picasso.aspx
Juste appeler la ligne suivante, ne pas vider le cache d'une photo lorsque vous utilisez les options de personnalisation comme le redimensionnement, le centre de culture etc lors de l'affichage de l'image d'origine.
La solution:
Lors de l'affichage de l'image, utilisez
stableKey()
méthode.Ensuite, vous pouvez effacer le cache de ce fichier plus tard par l'appel de cette:
Espère que cela aidera.
Vous pouvez passer de la mémoire cache par
skipMemoryCache()
voir la suite
gradle
compile "com.squareup.picasso:picasso:2.4.0"
Une autre option consiste à enregistrer la nouvelle image dans un fichier différent de l'original. Depuis le Picasso cache bitmap est incrustée hors du chemin d'accès au fichier, le chargement de la nouvelle image à partir d'un autre fichier de résultat dans un cache miss. Cela a aussi le côté avantage de ne pas avoir à effacer le cache entier.
utilisation
shutdown()
au lieuComme par le code source; arrêt pour arrêter d'accepter un surcroît de demande, ainsi que de tout effacer cache
Aussi, vous ne pouvez pas l'arrêt de l'instance du singleton.
Si vous avez besoin de la variable d'instance pour
Picasso
. Ne pas oublier de réinitialiser picasso exemple, chaque fois que vousshutdown()
elle afin de le réutiliser