Load images from disk cache with Picasso if offline

31,216

Solution 1

You can use this code by this strategy Picasso will look for images in cache and if it failed only then image will be downloaded over network.

 Picasso.with(context)
                    .load(Uri.parse(getItem(position).getStoryBigThumbUrl()))
                    .networkPolicy(NetworkPolicy.OFFLINE)
                    .into(holder.storyBigThumb, new Callback() {
                        @Override
                        public void onSuccess() {

                        }

                        @Override
                        public void onError() {
                            // Try again online if cache failed
                            Picasso.with(context)
                                    .load(Uri.parse(getItem(position)
                                            .getStoryBigThumbUrl()))
                            .placeholder(R.drawable.user_placeholder)
                            .error(R.drawable.user_placeholder_error)
                                    .into(holder.storyBigThumb);
                        }
                    });

Solution 2

Do this:

Picasso.with(this)
            .load(url)
            .networkPolicy(NetworkPolicy.OFFLINE)
            .into(imageView);

Also check my previous answer, maybe will help you: Invalidate cache in Picasso

Solution 3

This logic worked for me:

if network is available:
    Picasso.with(context).load(image).into(imageView);
else:
    Picasso.with(context).load(image).networkPolicy(NetworkPolicy.OFFLINE).into(imageView);

Solution 4

Is OkHttp and Okio present on the class path? (or in your dependencies) Because by default Picasso lets the HttpClient handle the caching (it does not do this by default)

You have 2 options

  • include the mentioned dependencies (recommended)
  • specify the cache manually

Solution 5

To avoid creating of separate instance of RequestCreator like here , do this:

 RequestCreator request = mPicasso.load(TextUtils.isEmpty(imageUrl) ? null : imageUrl)
                    .placeholder(R.drawable.ic_default)
                    .error(R.drawable.ic_default)
                    .transform(transformations)
                    .noFade()
                    .centerCrop();
            request
                    .networkPolicy(NetworkPolicy.OFFLINE)
                    .into(mImageView, new Callback.EmptyCallback(){
                        @Override
                        public void onError() {
                            super.onError();
                            request.into(mImageView);
                        }
                    });
Share:
31,216

Related videos on Youtube

Daniele Vitali
Author by

Daniele Vitali

Updated on July 19, 2020

Comments

  • Daniele Vitali
    Daniele Vitali almost 4 years

    I have some images that I download from different web sites when the app starts, by doing this:

    Picasso.with(context).load(image_url).fetch();
    

    Now, suppose the user closes the app and turns offline. When the app starts again, Picasso display the images in this way:

    Picasso.with(ctx).load(image_url).placeholder(R.drawable.ph).into(imageView);
    

    The problem is that some images are loaded from the disk cache (yellow triangle in debug mode), and for the others Picasso shows the placeholder.

    Why? I'm expecting that every image is loaded from the disk cache.

    • dnkoutso
      dnkoutso about 10 years
      Perhaps the fetch() has not completed yet and the result is not stored.
  • mhdjazmati
    mhdjazmati almost 8 years
    it tooks me 3 bloody days to realize that im not inculding those 2 dependencies with picasso , that was really stupid X( X( thank you for pointing that out :D
  • Nicolás Arias
    Nicolás Arias about 7 years
    As stated on the API specification, the OFFLINE policy will force the load from disk, skipping network square.github.io/picasso/2.x/picasso/com/squareup/picasso/…. So, if the image changes on server and I am online, will I never notice the change?
  • Zain
    Zain about 7 years
    Perfect solution for someone who wants an image caching library! :)
  • JCarlosR
    JCarlosR about 7 years
    At least for retrofit:2.2.0, the networkPolicy goes after the load method.
  • Alex Ionescu
    Alex Ionescu over 5 years
    No need to write this much :) You can specify multiple network policies. For example .networkPolicy(NetworkPolicy.OFFLINE, NetworkPolicy.NO_CACHE) should have a similar behaviour to your code