【问题标题】:How Picasso Actually Cache the Images毕加索实际上是如何缓存图像的
【发布时间】:2014-07-25 09:39:56
【问题描述】:

我想知道毕加索图书馆是如何在应用程序中缓存图像的。我知道它使用 HttpHeaders 来检查天气以从网络中获取图像。

但是,它是否有缓存图像的时间范围?
比如在一天后使缓存失效或其他什么?

问题是我的项目正在从网络加载大量小图像。有时,新图像会反映在下一次发布中。但是,有时它不会。

最糟糕的是,一些图像反映了变化,而其他图像 即使更改是同时进行的,也不是。
但是,当我卸载应用程序时,所有图像都得到了 反映了变化(当然)。

毕加索中必须有一些关于缓存的东西。

请不要告诉我使用 OkHttp 来控制 Picasso 中的缓存。
我的项目正在使用 Apache 的 AsyncHttpClient,它太大了,无法更新。
(当然不是我。我只是用 UrlConnection 创建一个小型网络助手,而不是实现整个 AsyncHttpClient。)

无论如何,任何想法或指针都将不胜感激。
底线:没有 OkHttp。只是想了解毕加索的缓存控制机制。

问候

【问题讨论】:

    标签: android picasso image-loading


    【解决方案1】:

    毕加索只有内存缓存。

    如果图像在内存缓存中,它会使用它。否则,当图像从其远程源(网络、内容提供者、文件系统等)加载时,它会被放置在内存缓存中以供将来查找。

    内存缓存是一个 LRU,因此使用的图像越多,它就越有可能保留在缓存中。随着时间的推移,不经常请求的图像将被逐出。没有时间驱逐,内存缓存不遵守任何 HTTP 标头的缓存语义(如果图像来自网络)。

    毕加索没有磁盘缓存。它 100% 依赖于 HTTP 客户端(无论使用哪个)来实现此功能。将自动为 OkHttp 或 HttpUrlConnection(如果使用任何一个)安装缓存,或者如果已经使用缓存。

    如果您使用自定义 HTTP 客户端,则启用缓存的负担由调用者承担。

    【讨论】:

    • 谢谢杰克。这本身就很好解释。但是,您能否更详细地说明“内存缓存不尊重任何 HTTP 标头的缓存语义”?还有关于“将为 OkHttp 和 HttpUrlConneciton 安装缓存”?坦率地说,我根本不想碰那个 AsyncHttpClient 机制。我看到 Picasso Source 中有“Cache”接口,LruCache 正在实现它。通过分叉 Picasso 来实现我自己的缓存机制是否明智?如果我实现自己的缓存,我可以像下面提到的 Ciprian 那样按时间范围设置一个触发器来清除它吗?
    • @JakeWharton,你摇滚,你可能对我在结尾括号中的“附加”问题感兴趣。stackoverflow.com/questions/25746356这对我来说是一个真正的谜。干杯!!!!一如既往地感谢你尖叫的粉丝
    【解决方案2】:

    据我所知,Picasso 不会自行清除缓存,因此在我们的应用程序中,我们会“手动”触发它。这样做的代码是这样的:

    private static final String PICASSO_CACHE = "picasso-cache";
    
    public static void clearCache(Context context) {
        final File cache = new File(
                context.getApplicationContext().getCacheDir(),
                PICASSO_CACHE);
        if (cache.exists()) {
            deleteFolder(cache);
        }
    }
    
    private static void deleteFolder(File fileOrDirectory) {
        if (fileOrDirectory.isDirectory()) {
            for (File child : fileOrDirectory.listFiles())
                deleteFolder(child);
        }
        fileOrDirectory.delete();
    }
    

    您可以每天/每周触发一次此清理工作人员,具体取决于您在应用中的需要。

    【讨论】:

    • 这仅在您使用 OkHttp 或 HttpUrlConnection 时有效,而帖子明确指出他不是。
    • 很公平,我们使用的是 OkHttp。
    猜你喜欢
    • 2014-04-10
    • 2015-10-16
    • 2013-08-31
    • 2015-05-07
    • 2019-09-14
    • 2016-06-18
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    相关资源
    最近更新 更多