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

Dan*_*ali 22 android caching picasso

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

Picasso.with(context).load(image_url).fetch();
Run Code Online (Sandbox Code Playgroud)

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

Picasso.with(ctx).load(image_url).placeholder(R.drawable.ph).into(imageView);
Run Code Online (Sandbox Code Playgroud)

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

为什么?我期待每个图像都从磁盘缓存加载.

Hit*_*ahu 34

您可以通过此策略使用此代码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);
                        }
                    });
Run Code Online (Sandbox Code Playgroud)

  • 不需要写这么多:) 您可以指定多个网络策略。例如`.networkPolicy(NetworkPolicy.OFFLINE, NetworkPolicy.NO_CACHE)` 应该和你的代码有类似的行为 (2认同)

Joã*_*ete 9

做这个:

Picasso.with(this)
            .load(url)
            .networkPolicy(NetworkPolicy.OFFLINE)
            .into(imageView);
Run Code Online (Sandbox Code Playgroud)

还要检查我之前的答案,也许会对你有所帮助: 在Picasso中使缓存无效

  • 如API规范中所述,OFFLINE策略将强制从磁盘加载,跳过网络https://square.github.io/picasso/2.x/picasso/com/squareup/picasso/NetworkPolicy.html.因此,如果图像在服务器上发生变化而我在线,我是否会注意到这一变化? (5认同)

Jor*_*aud 6

这个逻辑对我有用:

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


mar*_*itz 4

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

你有2个选择

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