清除Picasso的缓存

时间:2014-12-16 10:39:14

标签: android caching memory picasso

我正试图通过Android编码清除Picasso的缓存。

有谁可以帮我解决这个问题..?

我尝试使用以下代码,但这在我的情况下没用:

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

8 个答案:

答案 0 :(得分:30)

请改用:

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

答案 1 :(得分:11)

像这样删除Picasso的缓存。

public class Clear {

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

此util类可以为您清除缓存。你只需要打电话:

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

修改
Clear类必须在包中:

package com.squareup.picasso;

因为无法从该包外部访问缓存。 就像在这个答案:https://stackoverflow.com/a/23544650/4585226

答案 2 :(得分:7)

如果您尝试通过Json(来自db)加载图像,请尝试清除networkCache以获得更好的结果。

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

答案 3 :(得分:4)

当活动破坏时,遗憾的是如果我们使用Picasso,则不会回收位图。我尝试以编程方式回收位图,加载到图像视图中的内容。有一种方法可以使用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();
            }
        }
    };

当Activity销毁时,我调用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();
    }
}

但请记住,在这种情况下,不要使用CACHE IMAGE IN MEMORY,它会导致使用回收的位图异常。

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

希望得到这个帮助。

答案 4 :(得分:2)

如果想要使用给定的Uri刷新图像,而不是清除完整的缓存。试试这个Picasso.with(context).invalidate(uri);它会在内部从Picasso维护的缓存中删除密钥。

  

摘自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()); }

答案 5 :(得分:0)

如果您继续引用custom Downloader实施,则可以清除缓存。

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()方法清除缓存。

答案 6 :(得分:0)

我有同样的问题。 它对我有用。 我在对话框中的RecycleView中使用了 Picasso 。当我关闭对话框时,毕加索不会清除缓存。但是在您使用对话框时会清除图像缓存。但是有一些缓存未清除。也许未清除的缓存是您在dialog.dismiss()之前在对话框中看到的最后一个缓存。

使用它 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() {

                }
            });

答案 7 :(得分:0)

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

这也有效