Picasso入门教程(十一)Influencing Image Cache(影响图片缓存)

我们之前已经讲过,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_CACHENO_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。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值