web-dev-qa-db-fra.com

Charger des images à partir du cache disque avec Picasso en mode hors connexion

J'ai quelques images que je télécharge depuis différents sites Web lorsque l'application démarre, en procédant comme suit:

Picasso.with(context).load(image_url).fetch();

Supposons maintenant que l'utilisateur ferme l'application et se déconnecte. Lorsque l'application redémarre, Picasso affiche les images de la manière suivante:

Picasso.with(ctx).load(image_url).placeholder(R.drawable.ph).into(imageView);

Le problème est que certaines images sont chargées à partir du cache disque (triangle jaune en mode débogage), et pour les autres, Picasso affiche l’espace réservé.

Pourquoi? Je m'attends à ce que chaque image soit chargée à partir du cache disque.

19
Daniele Vitali

Vous pouvez utiliser ce code avec cette stratégie. Picasso recherchera les images en mémoire cache et si elle échoue uniquement, elle sera téléchargée sur le réseau.

 Picasso.with(context)
                    .load(Uri.parse(getItem(position).getStoryBigThumbUrl()))
                    .networkPolicy(NetworkPolicy.OFFLINE)
                    .into(holder.storyBigThumb, new Callback() {
                        @Override
                        public void onSuccess() {

                        }

                        @Override
                        public void onError() {
                            // Try again online if cache failed
                            Picasso.with(context)
                                    .load(Uri.parse(getItem(position)
                                            .getStoryBigThumbUrl()))
                            .placeholder(R.drawable.user_placeholder)
                            .error(R.drawable.user_placeholder_error)
                                    .into(holder.storyBigThumb);
                        }
                    });
31
Hitesh Sahu

Faites ceci:

Picasso.with(this)
            .load(url)
            .networkPolicy(NetworkPolicy.OFFLINE)
            .into(imageView);

Vérifiez également ma réponse précédente, peut-être vous aidera-t-il: Invalider le cache dans Picasso

9
João Machete

Cette logique a fonctionné pour moi:

if network is available:
    Picasso.with(context).load(image).into(imageView);
else:
    Picasso.with(context).load(image).networkPolicy(NetworkPolicy.OFFLINE).into(imageView);
6
Jordan Réjaud

Est-ce que OkHttp et Okio est présent sur le chemin de classe? (ou dans vos dépendances) Parce que par défaut, Picasso permet à HttpClient de gérer la mise en cache (il ne le fait pas par défaut)

Vous avez 2 options

  • inclure les dépendances mentionnées (recommandé)
  • spécifier le cache manuellement
4
martyglaubitz

Pour éviter de créer des instances séparées de RequestCreatorcomme ici , procédez comme suit:

 RequestCreator request = mPicasso.load(TextUtils.isEmpty(imageUrl) ? null : imageUrl)
                    .placeholder(R.drawable.ic_default)
                    .error(R.drawable.ic_default)
                    .transform(transformations)
                    .noFade()
                    .centerCrop();
            request
                    .networkPolicy(NetworkPolicy.OFFLINE)
                    .into(mImageView, new Callback.EmptyCallback(){
                        @Override
                        public void onError() {
                            super.onError();
                            request.into(mImageView);
                        }
                    });
0
NickUnuchek