【译】影响图片缓存行为

标准行为

Picasso实例中有如下默认设置:

This instance is automatically initialized with defaults that are suitable to most implementations.

  • LRU memory cache of 15% the available application RAM
  • Disk cache of 2% storage space up to 50MB but no less than 5MB. (Note: this is only available on API > 14+ or if you are using a standalone library that provides a disk cache on all API levels like OkHttp)
  • Three download threads for disk and network access.

缓存的大小可以随意更改,但显然超出了这篇文章的范围。回到主题上来:Picasso首先会尝试去内存中加载图像,如果最近没有加载过这张图片,或者这张图片并不存在于内存中,Picasso会去磁盘中检查它的存在。如果磁盘中也不存在,则开启网络请求。

此外,所有请求成功的图片都会保存到内存和磁盘中(除非为了释放内存而被删除)。总而言之就是,Picasso的加载路径为内存->磁盘-> 网络。

可以通过自定义内存和网络加载策略改变Picasso的行为。接下来一起看下MemoryPolicy

内存策略

再说一遍,Picasso试图先从内存中加载图片。如果你想让Picasso跳过内存查找,可以在Picasso请求上调用memoryPolicy(MemoryPolicy policy, MemoryPolicy... additional)MemoryPolicy是只有两个NO_CACHENO_STORE值的简单枚举类。

举例来说,可以使用NO_CACHE限制Picasso从内存中加载图片,示例如下:

Picasso  
    .with(context)
    .load(UsageExampleListViewAdapter.eatFoodyImages[1])
    .memoryPolicy(MemoryPolicy.NO_CACHE)
    .into(imageViewFromDisk);

如果你想知道如何使用NO_STORE这个枚举:比如说,当前请求的图片,只会被使用一次,那么就应该调用.memoryPolicy(MemoryPolicy.NO_STORE)。因此,Picasso不会把这张图片放入到内存缓存中。

当然,你可以在一个请求上联合使用这些特性:

Picasso  
    .with(context)
    .load(UsageExampleListViewAdapter.eatFoodyImages[1])
    .memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)
    .into(imageViewFromDisk);

需要注意的是,调用.memoryPolicy(MemoryPolicy.NO_CACHE)不会阻止Picasso从磁盘中查询图片!如果想跳过这两个缓存查询,你需要看一下NetworkPolicy

网络策略

NetworkPolicy调节磁盘缓存的方式与MemoryPolicy调节内存缓存的方式一样。甚至枚举的命名都是一样的。

如果你想跳过磁盘缓存,可以使用NetworkPolicy.NO_CACHE作为参数,调用.networkPolicy(NetworkPolicy policy, NetworkPolicy... additional)

Picasso  
    .with(context)
    .load(UsageExampleListViewAdapter.eatFoodyImages[2])
    .networkPolicy(NetworkPolicy.NO_CACHE)
    .into(imageViewFromNetwork);

当前,你可以把之前提到的任何可能的配置进行合并:

Picasso  
    .with(context)
    .load(UsageExampleListViewAdapter.eatFoodyImages[2])
    .memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)
    .networkPolicy(NetworkPolicy.NO_CACHE)
    .into(imageViewFromNetwork); 

最后,NetworkPolicy还有第三个可选参数:OFFLINE。如果选择这种模式,Picasso将会从内存或者磁盘中查询图片,如果这两种缓存中都没有查询到结果,即便网络连接可用,Picasso依然不会开启网络请求去加载图片。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏weixuqin 的专栏

springMVC 学习笔记(一):spring 入门

springMVC 是 spring 框架的一个模块,springMVC 和 spring 无需通过中间整合层进行整合。springMVC 是一个基于 mvc ...

1332
来自专栏老安的博客

openstack octavia 简介以及手工安装过程

9403
来自专栏张戈的专栏

零门槛!使用Docker快速部署ES集群

自从接触 Docker 之后,对 Docker 简直是爱不释手,做什么都是行云流水。遇到部署开源软件需求,第一时间想到的都是有没有现成的 Docker 镜像?能...

2.8K4
来自专栏三杯水

ELKB5.2.2集群环境部署配置优化终极文档

3,logstash filter 加入urldecode支持url、reffer、agent中文显示

3492
来自专栏禁心尽力

SpringBoot整合Mybatis之进门篇

已经有好些日子没有总结了,不是变懒了,而是我一直在奋力学习springboot的路上,现在也算是完成了第一阶段的学习,今天给各位总结总结。        之前...

1.5K6
来自专栏磨磨谈

Cephfs的快照功能

Cephfs的快照功能在官网都很少提及,因为即使开发了很多年,但是由于cephfs的复杂性,功能一直没能达到稳定,这里,只是介绍一下这个功能,怎么使用,并且建议...

1812
来自专栏Golang语言社区

在 Golang 项目中使用 Spring Cloud Config Server 管理配置

最近用 Go 写后端写得很开心,写篇比较实用的博客总结下如何通过 Spring Cloud Config Server 管理 Go 程序中的配置。 实现并不复杂...

2294
来自专栏程序猿DD

Spring Cloud构建微服务架构:Hystrix监控面板【Dalston版】

前言 在上一篇《服务容错保护(hystrix断路器)》的介绍中,我们提到断路器是根据一段时间窗内的请求情况来判断并操作断路器的打开和关闭状态的。而这些请求情况的...

2117
来自专栏乐沙弥的世界

Linux 6 下编译安装 PHP 5.6

2142
来自专栏云知识学习

TKE容器服务​创建ingress

ingress:通俗的理解是:通过7层负载均衡转发对应url到对应的path中,实现准确转发流量目的。

3152

扫码关注云+社区

领取腾讯云代金券