【问题标题】:Picasso - keeping images on disk毕加索 - 将图像保存在磁盘上
【发布时间】:2015-06-23 16:06:55
【问题描述】:

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

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

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

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

更新

根据这个 SO 问题的答案:

Android + Picasso: changing URL cache expiration

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

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

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

【问题讨论】:

    标签: android image caching picasso okhttp


    【解决方案1】:

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

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

    【讨论】:

    • 如何从 Picasso 访问缓存对象?我是否必须重写 OkHttpDownloader 类才能访问 getClient() 方法?
    • 没关系,我意识到我可以将 OkHttpClient 传递给 OkHttpDownloader :P
    • 毕加索是否查看缓存标头以确定缓存多长时间?
    【解决方案2】:

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

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

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

    其中cache 是您的自定义LruCache 类的一个实例

    【讨论】:

    • 这不会影响内存缓存,而不是磁盘缓存吗?
    【解决方案3】:

    当你想将图像存储在磁盘上时,你应该使用 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);
    

    【讨论】:

      猜你喜欢
      • 2016-06-18
      • 2015-07-13
      • 1970-01-01
      • 2015-03-27
      • 1970-01-01
      • 2018-02-05
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      相关资源
      最近更新 更多