J'utilise Picasso pour afficher l'image dans mon application Android:
/**
* load image.This is within a activity so this context is activity
*/
public void loadImage (){
Picasso picasso = Picasso.with(this);
picasso.setDebugging(true);
picasso.load(quiz.getImageUrl()).into(quizImage);
}
J'ai activé le débogage et il montre toujours le rouge et le vert. Mais jamais le jaune
Maintenant, si je charge la même image la prochaine fois et qu'Internet n'est pas disponible, l'image n'est pas chargée.
Des questions:
- N'a-t-il pas de cache disque local?
- Comment activer la mise en cache du disque car j'utiliserai la même image plusieurs fois.
- Dois-je ajouter une autorisation de disque au fichier manifeste Android?
Réponses:
C'est ce que j'ai fait. Fonctionne bien.
Ajoutez d'abord OkHttp au fichier de construction gradle du module d'application:
Ensuite, faites une classe en extension
Application
ajoutez-le au fichier Manifest comme suit:
Utilisez maintenant Picasso comme vous le feriez normalement. Aucun changement.
ÉDITER:
si vous souhaitez utiliser uniquement des images mises en cache. Appelez la bibliothèque comme ça. J'ai remarqué que si nous n'ajoutons pas le networkPolicy, les images n'apparaîtront pas dans un démarrage entièrement hors ligne, même si elles sont mises en cache . Le code ci-dessous résout le problème.
MODIFIER # 2
le problème avec le code ci-dessus est que si vous effacez le cache, Picasso continuera à le rechercher hors ligne dans le cache et échouera, l'exemple de code suivant examine le cache local, s'il n'est pas trouvé hors ligne, il se met en ligne et reconstitue le cache.
la source
okhttp3.OkHttpClient
bibliothèque, vous devez utiliser leOkHttp3Downloader
formulaire de classecompile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.1.0'
1) réponse à la première question: selon Picasso Doc pour la méthode With ()
Mais l'
Disk Cache
opération pour Picasso global par défaut n'est disponible que sur l'API 14+2) réponse à la deuxième question:
Picasso
utilisez laHTTP
demande du client pour l'Disk Cache
opération afin que vous puissiez créer votre proprehttp request header
propriété aCache-Control
avecmax-age
Et créer votre propre instance statique de Picasso au lieu de Picasso par défaut En utilisant1] HttpResponseCache (Remarque: fonctionne uniquement pour l'API 13+)
2] OkHttpClient (fonctionne pour toutes les API)
Exemple d'utilisation
OkHttpClient
pour créer votre propre classe statique Picasso:Créez d'abord une nouvelle classe pour obtenir votre propre
picasso
objet singletonutilisez votre propre
picasso
objet singleton au lieu dePicasso.With()
PicassoCache.getPicassoInstance(getContext()).load(imagePath).into(imageView)
3) réponse à la troisième question: vous n'avez besoin d'aucune autorisation de disque pour les opérations de cache de disque
Références : problème Github sur le cache disque , deux questions ont été répondues par @ jake-wharton -> Question1 et Question2
la source
FATAL EXCEPTION: main java.lang.NoClassDefFoundError: com.squareup.okhttp.OkHttpClient
okhttp
Pour la mise en cache, j'utiliserais des intercepteurs OkHttp pour prendre le contrôle de la politique de mise en cache. Consultez cet exemple inclus dans la bibliothèque OkHttp.
RewriteResponseCacheControl.java
Voici comment je l'utiliserais avec Picasso -
la source
Pour la version 2.71828 la plus récente, voici votre réponse.
Q1 : N'a-t-il pas de cache disque local?
A1 : Il y a une mise en cache par défaut dans Picasso et le flux de demande comme celui-ci
Partout où ils ont rencontré leur image en premier, ils utiliseront cette image, puis arrêteront le flux de demandes. Qu'en est-il du flux de réponse? Ne vous inquiétez pas, c'est ici.
Par défaut, ils seront d'abord stockés sur un disque local pour le cache de conservation étendu. Ensuite, la mémoire, pour l'utilisation de l'instance du cache.
Vous pouvez utiliser l'indicateur intégré dans Picasso pour voir où se forment les images en activant cette option.
Il affichera un drapeau dans le coin supérieur gauche de vos photos.
Q2 : Comment activer la mise en cache du disque car j'utiliserai la même image plusieurs fois?
A2 : Vous n'êtes pas obligé de l'activer. C'est la valeur par défaut.
Ce que vous devrez faire est de le désactiver lorsque vous voulez que vos images soient toujours fraîches. Il existe deux méthodes de mise en cache désactivée.
.memoryPolicy()
sur NO_CACHE et / ou NO_STORE et le flux ressemblera à ceci.NO_CACHE sautera la recherche d'images de la mémoire.
NO_STORE ignorera le stockage des images en mémoire lors du premier chargement d'images.
.networkPolicy()
sur NO_CACHE et / ou NO_STORE et le flux ressemblera à ceci.NO_CACHE sautera la recherche d'images à partir du disque.
NO_STORE ignorera le stockage des images sur le disque lors du premier chargement d'images.
Vous ne pouvez désactiver ni l'un ni l'autre pour aucune mise en cache des images. Voici un exemple.
Le flux sans mise en cache ni stockage ressemblera à ceci.
Vous en aurez peut-être besoin pour réduire également l'utilisation du stockage de votre application.
Q3 : Dois-je ajouter une autorisation de disque au fichier manifeste Android?
A3 : Non, mais n'oubliez pas d'ajouter l'autorisation INTERNET pour votre requête HTTP.
la source
1) Picasso par défaut a un cache (voir la réponse d'Ahmed Hamdy)
2) Si vous devez vraiment prendre une image du cache disque puis du réseau, je vous recommande d'écrire votre propre téléchargeur:
Et dans Application singleton dans la méthode OnCreate, utilisez-le avec picasso:
3) Aucune autorisation requise pour le dossier de cache d'application par défaut
la source
Ajoutez le code suivant
Application.onCreate
puis utilisez-le normalementSi vous mettez d'abord les images en cache, faites quelque chose comme ça dans
ProductImageDownloader.doBackground
et chargez vos images comme d'habitude ou avec la mise en cache disque
Remarque:
La couleur rouge indique que l'image est extraite du réseau .
La couleur verte indique que l'image est extraite de la mémoire cache .
La couleur bleue indique que l'image est extraite de la mémoire du disque .
Avant de publier l'application, supprimez-la ou définissez-la
false
picasso.setLoggingEnabled(true);
,picasso.setIndicatorsEnabled(true);
si cela n'est pas nécessaire. Mercila source
Je ne sais pas à quel point cette solution est bonne mais c'est définitivement LA FACILE je viens d'utiliser dans mon application et elle fonctionne bien
vous chargez l'image comme ça
Vous pouvez obtenir le
bimap
comme çaMaintenant, dissimulez cela
Bitmap
dans unJPG
fichier et stockez-le dans le cache, ci-dessous le code complet pour obtenir la bimap et la mettre en cachela
get()
méthode dePiccasso
pour une raison quelconque devait être appelée sur un fil séparé, j'enregistre également cette image sur ce même fil.Une fois l'image enregistrée, vous pouvez obtenir tous les fichiers comme ça
maintenant vous pouvez trouver le fichier que vous recherchez comme ci-dessous
la source
J'utilise ce code et j'ai travaillé, peut-être utile pour vous:
la source
J'ai eu le même problème et j'ai utilisé la bibliothèque Glide à la place. Le cache est hors de la boîte là-bas. https://github.com/bumptech/glide
la source