web-dev-qa-db-fra.com

Effacer la mémoire cache de Picasso

J'essaie de vider la mémoire cache de Picasso via le codage Android. 

Quelqu'un peut-il m'aider s'il vous plaît dans ce problème ..?

J'ai essayé d'utiliser le code suivant, mais ce n'était pas utile dans mon cas:

Picasso.with(getActivity()).load(data.get(pos).getFeed_thumb_image()).skipMemoryCache().into(image);
12
Parthiban M

si vous essayez de charger une image via Json (à partir de db), essayez de vider le networkCache pour obtenir un meilleur résultat.

Picasso.with(context).load(uri).networkPolicy(NetworkPolicy.NO_CACHE)
        .memoryPolicy(MemoryPolicy.NO_CACHE)
        .placeholder(R.drawable.bv_logo_default).stableKey(id)
        .into(viewImage_imageView);
7
Parthiban M

Utilisez ceci à la place:

 Picasso.with(getContext()).load(data.get(pos).getFeed_thumb_image()).memoryPolicy(MemoryPolicy.NO_CACHE).into(image);
30
Mohamed

Enlevez le cache de Picasso comme ceci.

public class Clear {

    public static void clearCache (Picasso p) {
        p.cache.clear();
    }
}

Cette classe util peut vider le cache pour vous. Vous devez juste l'appeler:

Clear.clearCache(Picasso.with(context));

MODIFIER:
La classe Clear doit être dans le package:

package com.squareup.picasso;

Parce que le cache n'est pas accessible de l'extérieur de ce paquet. Comme dans cette réponse: https://stackoverflow.com/a/23544650/4585226

11

Lorsque l'activité a été détruite, les images bitmap n'ont malheureusement pas été recyclées si nous utilisions Picasso. J'essaie de recycler par programme bitmap, ce qui est chargé dans la vue de l'image. Il existe un moyen de faire référence à un bitmap chargé en utilisant Target.

 Target mBackgroundTarget = new Target() {
        Bitmap mBitmap;

        @Override
        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
            if (bitmap == null || bitmap.isRecycled())
                return;

            mBitmap = bitmap;
            mBgImage.setImageBitmap(bitmap);
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    // Do some animation
                }
            });
        }

        @Override
        public void onBitmapFailed(Drawable errorDrawable) {
            recycle();
        }

        @Override
        public void onPrepareLoad(Drawable placeHolderDrawable) {

        }

        /**
         * Recycle bitmap to free memory
         */
        private void recycle() {
            if (mBitmap != null && !mBitmap.isRecycled()) {
                mBitmap.recycle();
                mBitmap = null;
                System.gc();
            }
        }
    };

Et quand l'activité détruit, j'appelle onBitmapFailed(null) pour recycler le bitmap chargé.

@Override
protected void onDestroy() {
    super.onDestroy();
    try {
        if (mBackgroundTarget != null) {
            mBackgroundTarget.onBitmapFailed(null);
            Picasso.with(context).cancelRequest(mBackgroundTarget);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Mais rappelez-vous, dans ce cas, NE CACHEZ PAS D'IMAGE EN MÉMOIRE, Cela provoquera une exception Utiliser une bitmap recyclée.

Picasso.with(context)
            .load(imageUrl)
            .resize(width, height)
            .memoryPolicy(MemoryPolicy.NO_CACHE)
            .into(mBackgroundTarget);

J'espère que cette aide.

4
khaintt

Au lieu d'effacer le cache complet si vous voulez actualiser l'image avec l'URI donné. essayez ceci Picasso.with(context).invalidate(uri); il enlève en interne la clé du cache maintenu par Picasso.

Extrait de Picasso.Java /** * Invalidate all memory cached images for the specified {@code uri}. * * @see #invalidate(String) * @see #invalidate(File) */ public void invalidate(Uri uri) { if (uri == null) { throw new IllegalArgumentException("uri == null"); } cache.clearKeyUri(uri.toString()); }

2
Devendra Vaja

j'ai eu le même problème… .. Cela a fonctionné pour moi… .. J'ai utilisé Picasso dans RecycleView dans une boîte de dialogue . Quand j'ai fermé la boîte de dialogue, Picasso n'efface pas le cache. Mais pendant que vous utilisez la boîte de dialogue, le cache d’image est effacé . Cependant, il y a du cache qui n'est pas effacé. Peut-être que le cache qui n'a pas été effacé est le dernier que vous avez vu dans la boîte de dialogue avant dialog.dismiss (). 

utiliser cette memoryPolicy (MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)

Picasso.with(activity).load(file).resize(100,100).centerCrop().memoryPolicy(MemoryPolicy.NO_CACHE,MemoryPolicy.NO_STORE).into(contactImage, new com.squareup.picasso.Callback() {
               @Override
                public void onSuccess() {

                }

                @Override
                public void onError() {

                }
            });

Si vous conservez la référence de votre implémentation customDownloader, vous pouvez vider le cache. 

public class PicassoUtil {
    private static Picasso sInstance;
    private static OkHttp22Downloader sDownloader;
    public  static Picasso getPicasso(Context context){
        if(sInstance == null) {
            sDownloader = new OkHttp22Downloader(context)
            Picasso.Builder builder = new Picasso.Builder(context);
            builder.downloader(sDownloader);
            sInstance = builder.build(sDownloader);
        }
        return sInstance;
    }
   public static void clearCache(){
      if(sDownloader != null){
        sDownloader.clearCache();
      }
   }
}

Il est important d’avoir accès à votre client http et à sa Cache. Dans mon implémentation, il existe un accès au cache, d'où son effacement avec la méthode clearCache().

0
Nikola Despotoski
 Picasso.with(this.getContext()).load(gamePlayer.getPlayerProfileUrl()).skipMemoryCache().into(iv);

Cela fonctionne aussi

0
Rushi Ayyappa