我正在尝试通过Android编程来清除Picasso的缓存内存。
有人能帮我解决这个问题吗..?
我已经尝试使用以下代码,但在我的情况下没有用:
Picasso.with(getActivity()).load(data.get(pos).getFeed_thumb_image()).skipMemoryCache().into(image);
请使用这个替代:
Picasso.with(getContext()).load(data.get(pos).getFeed_thumb_image()).memoryPolicy(MemoryPolicy.NO_CACHE).into(image);
像这样清除 Picasso 的缓存。
public class Clear {
public static void clearCache (Picasso p) {
p.cache.clear();
}
}
这个工具类可以帮助您清除缓存。您只需调用它:
Clear.clearCache(Picasso.with(context));
编辑:
类“Clear”必须在包中:
package com.squareup.picasso;
因为缓存不可从包外部访问。就像在这个答案中所述:https://dev59.com/rWEh5IYBdhLWcg3wyGDy#23544650
如果您正试图通过 Json(从数据库)加载图像,请尝试清除网络缓存以获得更好的结果。
Picasso.with(context).load(uri).networkPolicy(NetworkPolicy.NO_CACHE)
.memoryPolicy(MemoryPolicy.NO_CACHE)
.placeholder(R.drawable.bv_logo_default).stableKey(id)
.into(viewImage_imageView);
如果想要使用给定的Uri刷新图像,而不是清除整个缓存。可以尝试这个方法Picasso.with(context).invalidate(uri);
,它会自动从Picasso维护的缓存中移除对应的键。
摘自Picasso.java
/** * 为指定的{@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()); }
当activity被销毁时,如果我们使用Picasso,不幸的是bitmap没有被回收。我尝试通过编程的方式回收bitmap,即加载到image view中的bitmap。可以使用Target
引用加载的bitmap。
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();
}
}
};
onBitmapFailed(null)
来回收加载的位图。@Override
protected void onDestroy() {
super.onDestroy();
try {
if (mBackgroundTarget != null) {
mBackgroundTarget.onBitmapFailed(null);
Picasso.with(context).cancelRequest(mBackgroundTarget);
}
} catch (Exception e) {
e.printStackTrace();
}
}
Picasso.with(context)
.load(imageUrl)
.resize(width, height)
.memoryPolicy(MemoryPolicy.NO_CACHE)
.into(mBackgroundTarget);
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();
}
}
}
拥有访问您的http客户端及其Cache
非常重要。在我的实现中,可以访问缓存,因此可以使用clearCache()
方法清除缓存。
使用此代码 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() {
}
});
Picasso.with(this.getContext()).load(gamePlayer.getPlayerProfileUrl()).skipMemoryCache().into(iv);
这也可以工作
Picasso.with(context).shutdown()
可能会有帮助。 - activesince93