Picasso中的缓存无效

Maa*_*ten 74 android caching image-loading picasso

我使用Picasso从磁盘加载图像,例如,Picasso.with(ctx).load(new File("/path/to/image")).into(imageView)但每当我在该文件中保存新图像并刷新我的时候ImageView,Picasso仍然会缓存位图.

是否有可能使Picasso中的缓存无效?

mes*_*mes 85

在毕加索的最新版本中,有一种新的无效方法,没有任何解决方法,所以我认为前面提到的自定义PicassoTools类现在在这种情况下已经过时了

Picasso.with(getActivity()).invalidate(file);
Run Code Online (Sandbox Code Playgroud)

  • invalidate无效,图像仍保留在磁盘缓存中 (7认同)
  • 您需要使用`Picasso.with(imageView.getContext())加载图像.load(imageUrl).networkPolicy(NetworkPolicy.NO_CACHE).into(imageView);`as invalidate()不清除网络缓存 (7认同)
  • 好吧,这确实使单个文件无效.仍然没有方法使所有缓存无效.无论如何,我差不多一年前回复了这个问题,所以从那时起我就不会感到惊讶了. (3认同)

sha*_*afi 79

实际上,根据您自己的答案,有一种更简单的方法可以在不分支库的情况下完成.将此类添加到com.squareup.picasso包中.

package com.squareup.picasso;

public class PicassoTools {

    public static void clearCache (Picasso p) {
        p.cache.clear();
    }
}
Run Code Online (Sandbox Code Playgroud)

由于缓存具有包可见性,因此该util类可以为您清除缓存.你只需要调用它:

PicassoTools.clearCache(Picasso.with(context));
Run Code Online (Sandbox Code Playgroud)

  • 您不必访问jar.你必须创建这个文件并将其放在正确的包中(com.squareup.picasso) (19认同)
  • 很遗憾,"Picasso.with(getApplication()).cache.clear();`不起作用.它会更清洁. (7认同)
  • 如果您使用Gradle与Android Studio而不是附加jar文件,有没有办法做到这一点? (4认同)
  • 不,你不需要触摸Picasso jar,你只需要在正确的包中创建文件. (3认同)
  • Picasso.cache字段不可见!! (2认同)

小智 65

通过flag:emoryPolicy.NO_CACHE和NetworkPolicy.NO_CACHE指示内存策略中止内存缓存和磁盘缓存检查,如下面的代码片段:

   mPicasso.with(mContext)
            .load(url)
            .memoryPolicy(MemoryPolicy.NO_CACHE )
            .networkPolicy(NetworkPolicy.NO_CACHE)
            .resize(512, 512)
            .error(R.drawable.login)
            .noFade()
            .into(imageView);
Run Code Online (Sandbox Code Playgroud)

  • @ImanMarashi如果你经常使用相同的网址和不同的图像值,它会很有用(例如:amazonws.com/yourProject/user_profile_images/user1/profile.jpg.网址永远不会改变,但它的价值确实如此. (8认同)

小智 14

尝试使用:

Picasso.with(ctx).load(new File("/path/to/image")).skipMemoryCache().into(imageView)
Run Code Online (Sandbox Code Playgroud)


Law*_*oot 11

另一种选择是删除缓存目录本身,例如在应用启动时:

deleteDirectoryTree(context.getCacheDir());
Run Code Online (Sandbox Code Playgroud)

哪里:

/**
 * Deletes a directory tree recursively.
 */
public static void deleteDirectoryTree(File fileOrDirectory) {
    if (fileOrDirectory.isDirectory()) {
        for (File child : fileOrDirectory.listFiles()) {
            deleteDirectoryTree(child);
        }
    }

    fileOrDirectory.delete();
}
Run Code Online (Sandbox Code Playgroud)

这将删除整个缓存目录,如果您想模拟首次使用您的应用程序,这很好.如果您只想删除Picasso缓存,请在路径中添加"picasso-cache".


Aer*_*lys 11

如果要一次删除所有缓存,可以执行的操作是创建自定义Picasso.LruCache,然后clear在其上使用该方法.

这是一个示例:

Picasso.Builder builder = new Picasso.Builder(this);
LruCache picassoCache = new LruCache(this);
builder.memoryCache(picassoCache);
Picasso.setSingletonInstance(builder.build());
Run Code Online (Sandbox Code Playgroud)

要清除缓存:

picassoCache.clear();
Run Code Online (Sandbox Code Playgroud)


Ngu*_*Dat 10

Picasso中搜索图像的顺序是:内存缓存 - >磁盘缓存 - >网络

因此,我们需要在Picasso中使缓存无效的情况很少:

1.使内存缓存无效:

  • 用户案例:图像已在磁盘缓存或远程主机中更新
  • 解决方案:清除Url,File,Uri的缓存(如果存在)

    mPicasso.with(appContext).invalidate(File);
    mPicasso.with(appContext).invalidate(Url);
    mPicasso.with(appContext).invalidate(Uri);
    
    Run Code Online (Sandbox Code Playgroud)

.

2. 在线无效内存缓存和磁盘缓存

※注意:在线意味着直接更新到ImageView

  • 用户案例:在远程主机上更新了映像

  • 解决方案:在内存缓存和磁盘缓存上中止映像,然后在远程主机上请求映像

    mPicasso.with(appContext)
        .load(url)
        .memoryPolicy(MemoryPolicy.NO_CACHE )
        .networkPolicy(NetworkPolicy.NO_CACHE)
        .into(imageView);
    
    Run Code Online (Sandbox Code Playgroud)

    - >中止内存缓存和磁盘缓存

.

3.使内存缓存和磁盘缓存无效 脱机

※注意:离线平均更新不会更新到ImageView,只需后台获取即可使用

  • 用户案例:您知道远程主机上的映像已更新,但只想更新缓存只能在之后使用(不更新到图像视图中)
  • 解决方案:仅提取

     mPicasso.with(appContext)
        .load(url)
        .memoryPolicy(MemoryPolicy.NO_CACHE)
        .networkPolicy(NetworkPolicy.NO_CACHE)
        .fetch();
    
    Run Code Online (Sandbox Code Playgroud)

※注意:使用fetch()是好的但它也消耗网络资源,所以请仔细考虑,检查下面的方案4以获得更好的解决方案

4.Invalidate内存缓存和磁盘高速缓存 离线如果磁盘缓存是存在

  • 用户案例:如果磁盘缓存中已存在,则仅使缓存无效
  • 解决方案:在获取之前,应使用参数:NetworkPolicy.OFFLINE cache来检查磁盘

     mPicasso.with(appContext)
        .load(url)
        .memoryPolicy(MemoryPolicy.NO_CACHE)
        .networkPolicy(NetworkPolicy.OFFLINE)
        .fetch(new Callback() {
            @Override
            public void onSuccess() {
                //Success: mean disk cache exist -> should do actual fetch
                picasso.load(url).fetch();
            }
    
            @Override
            public void onError() {
            //Failed: mean disk cache not exist
        }
    });
    
    Run Code Online (Sandbox Code Playgroud)

Picasso是一个很棒的库,我希望squareup将在未来添加更多便利API来管理缓存.


Sta*_*Kou 8

您可以通过设置自己的缓存清除毕加索的图像缓存并清除它.此代码在Picasso 2.5.0上进行了测试

private Picasso picasso;
private LruCache picassoLruCache;

picassoLruCache = new LruCache(context);

// Set cache
picasso = new Picasso.Builder(context) //
        .memoryCache(picassoLruCache) //
        .build();

// Clear cache
picassoLruCache.clear();
Run Code Online (Sandbox Code Playgroud)


Joã*_*ete 6

不循环,但这种方法解决了缓存和毕加索的问题.只有在想要使特定URL的缓存无效时才使用此方法,这种方法很慢,可能不是正确的做法但对我有用.

    String url = "http://www.blablabla.com/Raiders.jpg";
    Picasso.with(this).invalidate(url);
    Picasso.with(this)
            .load(url)
            .networkPolicy(
                    NetworkUtils.isConnected(this) ?
                            NetworkPolicy.NO_CACHE : NetworkPolicy.OFFLINE)
            .resize(200, 200)
            .centerCrop()
            .placeholder(R.mipmap.ic_avatar)
            .error(R.mipmap.ic_avatar)
            .into(imageView);
Run Code Online (Sandbox Code Playgroud)