如果脱机,使用Picasso从磁盘缓存加载映像

时间:2014-04-30 14:58:29

标签: android caching picasso

我在应用启动时从不同的网站下载了一些图片:

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

现在,假设用户关闭了应用并转为离线。当应用程序再次启动时,Picasso会以这种方式显示图像:

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

问题是某些图像是从磁盘缓存加载的(调试模式下的黄色三角形),而其他图像则是Picasso显示占位符。

为什么呢?我希望每个图像都是从磁盘缓存中加载的。

5 个答案:

答案 0 :(得分:33)

您可以通过此策略使用此代码Picasso将在缓存中查找图像,如果只是失败,则图像将通过网络下载。

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

答案 1 :(得分:9)

执行此操作:

createMessageTextView()

同时查看我之前的回答,也许会对您有所帮助: Invalidate cache in Picasso

答案 2 :(得分:6)

这个逻辑对我有用:

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

答案 3 :(得分:4)

类路径上是否有OkHttpOkio? (或在您的依赖项中) 因为默认情况下Picasso让HttpClient处理缓存 (默认情况下不会这样做)

您有2个选项

  • 包括提到的依赖项(推荐)
  • 手动指定缓存

答案 4 :(得分:1)

为避免创建RequestCreator like here的单独实例,请执行以下操作:

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