我们之前已经讲过,Picasso使用硬盘和内存中缓存的图片,这样加载起来会更快一些。在这篇博客中,我们深入了解一下Picasso的缓存策略。
标准行为
下面是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总是先从memery cache中加载图片。如果图片最近没有请求过,并且图片并没有在memory cache中缓存,Picasso再检验一下disk cache。如果图片不在disk cache中,Picasso再进行网络请求。
此外,如果请求的图片在两种内存中(直到他们不得不按顺序删除来释放空间)。总之,Picasso检验顺序是memory->disk->network.
如果你不需要Picasso这么做,你可以自定义内存缓存机制。让我们来看一下MemoryPolicy。
Memory Policy
再说一次,Picasso首先尝试首先在内存中加载图片。如果你不想Picasso这么做,你可以调用memoryPolicy(MemoryPolicy policy, MemoryPolicy... additional)
。MemoryPolicy有两种枚举类型的参数:NO_CACHE
和NO_STORE
。
如果你不想从内存中加载图片,你可以使用NO_CACHE
。下面是例子:
Picasso
.with(context)
.load(UsageExampleListViewAdapter.eatFoodyImages[1])
.memoryPolicy(MemoryPolicy.NO_CACHE)
.into(imageViewFromDisk);
如果你知道这张图片只需要使用一次,你可以使用.memoryPolicy(MemoryPolicy.NO_STORE)
。Picasso将不会将图片加载到memory cache。当然,你也可以两种选择一块使用:
Picasso
.with(context)
.load(UsageExampleListViewAdapter.eatFoodyImages[1])
.memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)
.into(imageViewFromDisk);
Beware, calling .memoryPolicy(Memory
需要当心的是:.memoryPolicy(MemoryPolicy.NO_CACHE)
这个方法不会阻止Picasso将图片加载到disk cache。为了跳过这两种缓存,你可以看一下NetworkPolicy
.
Network Policy
MemoryPolicy控制memory cache 而NetworkPolicy控制disk cache。两个枚举类型的参数和之前是一样的,如果你不想缓存到disk cache,你可以调用:.networkPolicy(NetworkPolicy policy, NetworkPolicy... additional)
参数传NetworkPolicy.NO_CACHE
。
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将会从任意一种cache中加载图片。但是这时不会进行网络请求,即使这个时候有网络连接而且并没有在内存中找到缓存图片。
总结
在大多数情况下,Picasso的默认行为使用起来都特别合适。然而,如果你需要定制请求,Picasso也可以满足你。在下一篇博客中,我们可以进一步了解Picasso。