Load images from disk cache with Picasso if offline

安稳与你 提交于 2019-11-26 11:03:47

问题


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.


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



回答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




回答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);



回答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



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


来源:https://stackoverflow.com/questions/23391523/load-images-from-disk-cache-with-picasso-if-offline

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!