毕加索 - 将图像保存在磁盘上

Picasso - keeping images on disk

我正在使用 Picasso 在我的应用程序中下载图像。我的理解是它使用 http 客户端(HttpResponseCache 或 OkHttpClient)将这些图像缓存在磁盘上。

在不太了解这两个库的情况下,是否可以将某些图像标记为永久图像?换句话说,我想下载一张图片并保证它可以离线使用。

考虑一下,我真的不能让磁盘缓存超过一定大小,所以我想我真正需要的是删除图像上的 TTL url 并允许删除缓存先进先出场景中的图像。

在那种情况下,我可以控制首先删除哪个图像(通过使用基于访问的时间戳,而不是下载的时间戳)吗?

更新

基于这个 SO 问题的答案:

Android + Picasso: changing URL cache expiration

所以这回答了问题的第一部分 - 我们可以通过服务器控制 TTL。

与同事交谈后,他指出http客户端应该考虑图像访问的频率(除了TTL)。所以希望我也不必担心这个。

这留给我一个问题。我知道哪些图像我不再需要了,我可以从磁盘缓存中删除图像吗?

您必须扩展 Picasso 的默认缓存并创建自定义 Picasso 实例才能使用它:

  1. 延长LruCache
  2. 覆盖 void set(String key, Bitmap bitmap) 方法以执行您描述的操作(添加时间戳等)。查看原始源代码here.
  3. 确保原始的 trimToSize 方法永远不会被 set(和 clearKeyUri 调用),并编写自己的方法来检查时间戳等以获取您描述的行为
  4. 像这样使用自定义缓存创建自定义 Picasso 实例:

Picasso picasso = new Picasso.Builder(context).memoryCache(cache).build(); Picasso.setSingletonInstance(picasso);

其中 cache 是您的自定义实例 LruCache class

你可以遍历OkHttp的磁盘缓存中的元素,调用Iterator.remove()去掉你不想要的。

http://square.github.io/okhttp/javadoc/com/squareup/okhttp/Cache.html#urls--

当您想将图像存储在磁盘上时,您应该使用 okhttpdownloader

OkHttpClient client = new OkHttpClient.Builder()
                .cache(new Cache(getCacheDir(), Integer.MAX_VALUE))
                .build();
        Picasso build = new Picasso.Builder(this)
                .downloader(new OkHttp3Downloader(client))
                .build();
        Picasso.setSingletonInstance(build);