Comment puis-je utiliser la mise en cache disque de Picasso?
Je suis à l'aide de 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 activer le débogage et il indique toujours le rouge et le vert .Mais ne montre jamais jaune
Maintenant, si je charge une même image, la prochaine fois, et internet n'est pas disponible, l'image n'est pas chargée.
Questions:
- N'ont pas de disque local cache?
- Comment puis-je activer la mise en cache du disque que je vais être en utilisant la même image plusieurs fois.
- Dois-je besoin d'ajouter un peu de disque autorisation pour android fichier manifest?
- Je vais avoir le même problème. Il ne cache!
- Les gars, vous devriez jeter un oeil à facebooks Fresque lib. Sa gestion du cache est génial.
Vous devez vous connecter pour publier un commentaire.
C'est ce que j'ai fait. Fonctionne bien.
D'abord ajouter le OkHttp à la gradle fichier de compilation de l'application module:
Puis faire une classe étendant
Application
l'ajouter au fichier Manifeste comme suit :
Maintenant utiliser Picasso comme vous le feriez normalement. Pas de changements.
EDIT:
si vous souhaitez utiliser la mise en cache des images seulement. Téléphonez à la bibliothèque ce genre. J'ai remarqué que si on ne rajoute pas de la networkPolicy, les images ne s'affichent pas complètement hors de début même si ils sont mis en cache. Le code ci-dessous permet de résoudre le problème.
EDIT #2
le problème avec le code ci-dessus est que si vous effacer la mémoire cache, Picasso va continuer à chercher hors-ligne dans le cache et ne parviennent pas, l'exemple de code suivant regarde le cache local, si elle ne trouve pas en mode hors connexion, il va en ligne et régénère le cache.
ImageView
ok?compile 'com.squareup.okhttp:okhttp-urlconnection:2.7.4'
à mon gradle.NetworkPolicy.OFFLINE
, "les Forces de la demande à travers le cache disque uniquement, en sautant de réseau", qui est le problème. Mais c'est seulement une supposition. Je n'ai pas d'écrire un essai de démonstration.)NetworkPolicy.OFFLINE
dans leonError()
du premier appel.new OkHttpDownloader(this,Integer.MAX_VALUE)
partie. Ceci permettra de définir la taille maximum de la mémoire cache à "l'infini" et votre taille de l'application sera de plus en plus.okhttp3.OkHttpClient
de la bibliothèque, vous devez utiliserOkHttp3Downloader
classe formecompile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.1.0'
/cache/picasso-cache
dossier est vide. Je suis en train de cache des vignettes stackoverflow.com/a/30045646/4548520OkHttp
est déjà à l'intérieur de picasso pourquoi doit-on le mettre dans gradle?Picasso.with(getActivity()) .load(imageUrl) .networkPolicy(NetworkPolicy.OFFLINE)
je ne vois pas de picasso cache dans l'app dossier privépicasso.setIndicatorsEnabled(true); picasso.setLoggingEnabled(true);
c'est pour le débogage, il n'est pas lié à une question!1) réponse de la première question :
selon Picasso Doc pour Avec() la méthode
Mais
Disk Cache
fonctionnement global par Défaut Picasso est disponible uniquement sur les API 14+2) réponse à la deuxième Question :
Picasso
utiliser leHTTP
demande du client pourDisk Cache
opération Donc vous pouvez faire votre proprehttp request header
a bienCache-Control
avecmax-age
Et de créer votre propre Statique Picasso Instance au lieu de la valeur par défaut Picasso En utilisant
1] HttpResponseCache (Note: ne Fonctionne que pour les API 13+ )
2] OkHttpClient (Fonctionne pour toutes les Api)
Exemple pour l'utilisation de
OkHttpClient
pour créer votre propre Statique Picasso classe:D'abord créer une nouvelle classe pour obtenir votre propre singleton
picasso
objetutiliser votre propre singleton
picasso
objet au Lieu dePicasso.With()
PicassoCache.getPicassoInstance(getContext()).load(imagePath).into(imageView)
3) réponse pour la troisième question : vous n'avez pas besoin de toutes les autorisations du disque pour le Cache disque opérations
Références: Github question à propos de cache disque, deux Questions ont été répondues par @jake-wharton -> Question1 et Question2
FATAL EXCEPTION: main java.lang.NoClassDefFoundError: com.squareup.okhttp.OkHttpClient
okhttp
setIndicatorsEnabled(true)
sur le Picasso de l'instance. pour plus de détails, voir doc officielle.with
), à partir de la version 2.7with
méthode dans ma solutionDo not place Android context classes in static fields (static reference to Picasso which has field context pointing to Context); this is a memory leak (and also breaks Instant Run)
Pour la mise en cache, je voudrais utiliser OkHttp intercepteurs à prendre le contrôle politique de mise en cache. Découvrez ce sample qui est inclus dans l'OkHttp bibliothèque.
RewriteResponseCacheControl.java
Voici comment j'allais l'utiliser avec Picasso -
1) Picasso a par défaut de cache (voir ahmed hamdy réponse)
2) Si vous devez vraiment prendre de l'image à partir du disque de cache et puis réseau, je recommande d'écrire votre propre downloader:
Et en Application de singleton dans la méthode OnCreate de l'utiliser avec picasso:
3) Aucune autorisation n'est nécessaire pour defalut cache de l'application dossier
- Je utiliser ce code et travaillé, peut-être utile pour vous:
Ajouter followning code dans
Application.onCreate
ensuite utiliser ce normalSi vous cache des images d'abord, puis faire quelque chose comme cela dans
ProductImageDownloader.doBackground
et charger vos images comme normale ou avec la mise en cache disque
Remarque:
Rouge couleur indique que l'image est récupérée à partir de réseau.
Vert couleur indique que l'image est récupérée à partir de mémoire cache.
Bleu couleur indique que l'image est récupérée à partir de la mémoire du disque.
Avant de relâcher l'app supprimer ou le mettre
false
picasso.setLoggingEnabled(true);
,picasso.setIndicatorsEnabled(true);
si besoin est. ThankxPour la dernière version mise à jour 2.71828
Ce sont vos réponse.
T1: N'est-il pas avoir le disque local cache?
A1: Il y a mise en cache par défaut au sein de Picasso et de la demande de débit, tout comme ce
Où ils ont rencontré leur image d'abord, ils vont utiliser cette image et puis arrêtez la demande de débit.
Ce que sur la réponse des flux? Ne vous inquiétez pas, elle est ici.
Par défaut, elles seront stockées dans un disque local d'abord pour le maintien de cache. De mémoire, pour l'utilisation d'une instance de la cache.
Vous pouvez utiliser les indicateurs intégrés dans Picasso pour voir où l'image se forme par l'activation de ce.
Il va montrer un drapeau sur le coin en haut à gauche de vos photos.
T2: Comment puis-je activer la mise en cache du disque que je vais utiliser la même image plusieurs fois?
A2: Vous n'avez pas à l'activer. C'est la valeur par défaut.
Ce que vous devez faire est de DÉSACTIVER quand vous voulez que vos images sont toujours frais. Il y a 2-moyen de désactivé la mise en cache.
.memoryPolicy()
à NO_CACHE et/ou NO_STORE et le flux ressemblera à ceci.NO_CACHE va sauter à la recherche des images de la mémoire.
NO_STORE va sauter stocker des images dans la mémoire lors de la première charger les images.
.networkPolicy()
à NO_CACHE et/ou NO_STORE et le flux ressemblera à ceci.NO_CACHE va sauter à la recherche d'images à partir du disque.
NO_STORE va sauter stocker des images dans le disque lors du premier chargement des images.
Vous pouvez DÉSACTIVER ni pour aucune mise en cache des images. Ici est un exemple.
Le flux de totalement pas de mise en cache et pas de stockage doit ressembler à cela.
Donc, vous pourriez avoir besoin de ce minifier votre application de stockage de l'utilisation aussi.
T3: ai-je besoin d'ajouter un peu de disque autorisation pour android fichier manifest?
A3: Non, mais n'oubliez pas d'ajouter le INTERNET autorisation pour votre requête HTTP.
J'ai eu le même problème et utilisé Glisse de la bibliothèque de la place. Le Cache est en dehors de la boîte.
https://github.com/bumptech/glide