Solution 1:

In the recent versions of Picasso, there is a new method for invalidate, without any workarounds, so I think that custom PicassoTools class mentioned earlier, is now obsolete in this case

Picasso.with(getActivity()).invalidate(file);

Solution 2:

Actually, based on your own answer, there is an easier way to do it without forking the library. Add this class to the com.squareup.picasso package.

package com.squareup.picasso;

public class PicassoTools {

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

Because cache has package visibility, this util class can clear the cache for you. You just have to call it:

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

Solution 3:

Abort memory cache and disk cache check by indicate memory policy by flag: emoryPolicy.NO_CACHE and NetworkPolicy.NO_CACHE as below code snippet:

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

Solution 4:

Try to use:

Picasso.with(ctx).load(new File("/path/to/image")).skipMemoryCache().into(imageView)

Solution 5:

The order of search image in Picasso is: Memory cache -> Disk cache -> Network

So there are few scenario we need to invalidate cache in Picasso:

1.Invalidate memory cache:

  • Usercase: When image already update in disk cache or remote host
  • Solution: Clear cache of Url, File, Uri if exist

    mPicasso.with(appContext).invalidate(File);
    mPicasso.with(appContext).invalidate(Url);
    mPicasso.with(appContext).invalidate(Uri);
    

.

2.Invalidate memory cache and disk cache Online

※note: Online mean update directly to ImageView

  • User case: Image updated on remote host

  • Solution: Abort image on memory cache and disk cache then request image on remote host

    mPicasso.with(appContext)
        .load(url)
        .memoryPolicy(MemoryPolicy.NO_CACHE )
        .networkPolicy(NetworkPolicy.NO_CACHE)
        .into(imageView);
    

    -> Abort memory cache and disk cache

.

3.Invalidate memory cache and disk cache Offline

※ note: Offline mean update not update to ImageView, just background fetch to using later

  • User case: You know image on remote host updated, but only want to update cache only to using afterward (not update into image view)
  • Solution: fetch only

     mPicasso.with(appContext)
        .load(url)
        .memoryPolicy(MemoryPolicy.NO_CACHE)
        .networkPolicy(NetworkPolicy.NO_CACHE)
        .fetch();
    

※Note: Using fetch() is good but it also consume network resource, so please consider carefully, check scenario 4 in below for better solution

4.Invalidate memory cache and disk cache Offline if disk cache is exist

  • User case: Only invalidate cache if already exist in disk cache
  • Solution: Should check disk by using parameter: NetworkPolicy.OFFLINE cache before fetch

     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
        }
    });
    

Picasso is an amazing libs, I hope squareup will add more convenience API to manage cache in upcoming future.