我使用Picasso在我的应用中下载图片。我的理解是它使用http客户端(HttpResponseCache或OkHttpClient)将这些图像缓存在磁盘上。
如果不了解这些库中的任何一个,是否可以将某些图像标记为永久图像?换句话说,我想下载一张图片并保证它可以离线使用。
考虑到这一点,我真的无法让磁盘缓存超过一定的大小,所以我想我真正需要的是删除图像网址上的TTL并允许缓存首先删除图像在第一个场景中。
在这种情况下,我可以控制首先删除哪个图像(使用基于访问而不是下载的时间戳)?
根据这个SO问题的答案:
Android + Picasso: changing URL cache expiration
所以这回答了问题的第一部分 - 我们可以通过服务器控制TTL。
在与同事交谈后,他指出http客户端应该考虑访问图像的频率(除了TTL之外)。所以我希望我也不必为此担心。
这给我留下了一个问题。我知道我不再需要哪些图像,我可以从磁盘缓存中删除图像吗?
答案 0 :(得分:1)
您可以在OkHttp的磁盘缓存中迭代这些元素,并调用Iterator.remove()
来删除您不想要的内容。
http://square.github.io/okhttp/javadoc/com/squareup/okhttp/Cache.html#urls--
答案 1 :(得分:0)
您必须扩展Picasso的默认缓存并创建自定义Picasso实例才能使用它:
void set(String key, Bitmap bitmap)
方法以执行您描述的操作(添加时间戳等)。查看原始源代码here。trimToSize
方法永远不会被set
(以及clearKeyUri
调用),并编写自己的方法以检查时间戳等以获取您的行为描述 Picasso picasso = new Picasso.Builder(context).memoryCache(cache).build(); Picasso.setSingletonInstance(picasso);
cache
是自定义LruCache
类的实例
答案 2 :(得分:0)
如果要将图像存储在磁盘上,则应使用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);