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

时间:2015-04-17 01:00:14

标签: android image caching picasso okhttp

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

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

考虑到这一点,我真的无法让磁盘缓存超过一定的大小,所以我想我真正需要的是删除图像网址上的TTL并允许缓存首先删除图像在第一个场景中。

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

更新

根据这个SO问题的答案:

Android + Picasso: changing URL cache expiration

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

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

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

3 个答案:

答案 0 :(得分:1)

您可以在OkHttp的磁盘缓存中迭代这些元素,并调用Iterator.remove()来删除您不想要的内容。

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

答案 1 :(得分:0)

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

  1. 延长LruCache
  2. 覆盖void set(String key, Bitmap bitmap)方法以执行您描述的操作(添加时间戳等)。查看原始源代码here
  3. 确保原始的trimToSize方法永远不会被set(以及clearKeyUri调用),并编写自己的方法以检查时间戳等以获取您的行为描述
  4. 使用您的自定义缓存创建自定义Picasso实例,如下所示:
  5. 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);