毕加索 - 将图像保存在磁盘上
Picasso - keeping images on disk
我正在使用 Picasso 在我的应用程序中下载图像。我的理解是它使用 http 客户端(HttpResponseCache 或 OkHttpClient)将这些图像缓存在磁盘上。
在不太了解这两个库的情况下,是否可以将某些图像标记为永久图像?换句话说,我想下载一张图片并保证它可以离线使用。
考虑一下,我真的不能让磁盘缓存超过一定大小,所以我想我真正需要的是删除图像上的 TTL url 并允许删除缓存先进先出场景中的图像。
在那种情况下,我可以控制首先删除哪个图像(通过使用基于访问的时间戳,而不是下载的时间戳)吗?
更新
基于这个 SO 问题的答案:
Android + Picasso: changing URL cache expiration
所以这回答了问题的第一部分 - 我们可以通过服务器控制 TTL。
与同事交谈后,他指出http客户端应该考虑图像访问的频率(除了TTL)。所以希望我也不必担心这个。
这留给我一个问题。我知道哪些图像我不再需要了,我可以从磁盘缓存中删除图像吗?
您必须扩展 Picasso 的默认缓存并创建自定义 Picasso 实例才能使用它:
- 延长LruCache
- 覆盖
void set(String key, Bitmap bitmap)
方法以执行您描述的操作(添加时间戳等)。查看原始源代码here.
- 确保原始的
trimToSize
方法永远不会被 set
(和 clearKeyUri
调用),并编写自己的方法来检查时间戳等以获取您描述的行为
- 像这样使用自定义缓存创建自定义 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);
我正在使用 Picasso 在我的应用程序中下载图像。我的理解是它使用 http 客户端(HttpResponseCache 或 OkHttpClient)将这些图像缓存在磁盘上。
在不太了解这两个库的情况下,是否可以将某些图像标记为永久图像?换句话说,我想下载一张图片并保证它可以离线使用。
考虑一下,我真的不能让磁盘缓存超过一定大小,所以我想我真正需要的是删除图像上的 TTL url 并允许删除缓存先进先出场景中的图像。
在那种情况下,我可以控制首先删除哪个图像(通过使用基于访问的时间戳,而不是下载的时间戳)吗?
更新
基于这个 SO 问题的答案:
Android + Picasso: changing URL cache expiration
所以这回答了问题的第一部分 - 我们可以通过服务器控制 TTL。
与同事交谈后,他指出http客户端应该考虑图像访问的频率(除了TTL)。所以希望我也不必担心这个。
这留给我一个问题。我知道哪些图像我不再需要了,我可以从磁盘缓存中删除图像吗?
您必须扩展 Picasso 的默认缓存并创建自定义 Picasso 实例才能使用它:
- 延长LruCache
- 覆盖
void set(String key, Bitmap bitmap)
方法以执行您描述的操作(添加时间戳等)。查看原始源代码here. - 确保原始的
trimToSize
方法永远不会被set
(和clearKeyUri
调用),并编写自己的方法来检查时间戳等以获取您描述的行为 - 像这样使用自定义缓存创建自定义 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);