【问题标题】:Load images from disk cache with Picasso if offline如果离线,使用 Picasso 从磁盘缓存加载图像
【发布时间】:2014-06-16 23:26:15
【问题描述】:

当应用程序启动时,我从不同的网站下载了一些图像,通过这样做:

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

现在,假设用户关闭应用并离线。当应用再次启动时,毕加索以这种方式显示图像:

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

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

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

【问题讨论】:

  • 可能fetch()还没有完成,结果没有存储。

标签: android caching picasso


【解决方案1】:

您可以通过此策略使用此代码 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);
                        }
                    });

【讨论】:

  • 对于想要一个图像缓存库的人来说是完美的解决方案! :)
  • 不用写这么多:) 你可以指定多个网络策略。例如.networkPolicy(NetworkPolicy.OFFLINE, NetworkPolicy.NO_CACHE) 应该与您的代码有类似的行为
【解决方案2】:

这样做:

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

还可以查看我之前的答案,也许会对您有所帮助: Invalidate cache in Picasso

【讨论】:

【解决方案3】:

这个逻辑对我有用:

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

【讨论】:

  • 至少对于retrofit:2.2.0,networkPolicy 在加载方法之后。
【解决方案4】:

OkHttpOkio 是否存在于类路径中? (或在您的依赖项中) 因为默认情况下,毕加索让 HttpClient 处理缓存 (默认情况下不这样做)

你有两个选择

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

【讨论】:

  • 我花了 3 天时间才意识到我没有将这两个依赖项与 picasso 包含在内,这真的很愚蠢 X( X(谢谢你指出这一点 :D
【解决方案5】:

为避免创建 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);
                        }
                    });

【讨论】:

    猜你喜欢
    • 2018-08-22
    • 2015-05-16
    • 1970-01-01
    • 2016-06-25
    • 2015-10-01
    • 2014-04-25
    • 2014-07-21
    • 2015-11-15
    • 1970-01-01
    相关资源
    最近更新 更多