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);
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);
Utilisez ceci à la place:
Picasso.with(getContext()).load(data.get(pos).getFeed_thumb_image()).memoryPolicy(MemoryPolicy.NO_CACHE).into(image);
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
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.
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()); }
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()
.
Picasso.with(this.getContext()).load(gamePlayer.getPlayerProfileUrl()).skipMemoryCache().into(iv);
Cela fonctionne aussi