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

来源:互联网 发布:雅俗共赏歌词知乎分析 编辑:程序博客网 时间:2024/05/31 19:07

我们之前已经讲过,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 0
原创粉丝点击