毕加索如何实际缓存图像

时间:2014-07-25 09:39:56

标签: android picasso image-loading

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

但是,有没有时间框架缓存图像?
喜欢在一天之后无效的缓存吗?

问题是我的项目是从网络上加载大量的小图像。有时,新图像会在下次发布时反映出来。但是,有时候,它并没有。

  

最糟糕的是,一些图像反映了变化而其他图像反映了变化   虽然更改是在同一时间进行的。但是,当我卸载App时,所有图像都得到了   反映了这些变化(当然。)

毕加索必须有一些关于缓存的内容。

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

无论如何,任何想法或指针都会受到赞赏 底线:没有OkHttp。只想了解Picasso上的缓存控制机制。

此致

2 个答案:

答案 0 :(得分:16)

Picasso只有一个内存缓存。

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

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

Picasso没有磁盘缓存。它依赖于HTTP客户端(无论使用哪个)来实现100%的此功能。将自动为OkHttp或HttpUrlConnection(如果使用的话)安装缓存,或者如果已经使用了缓存,则会安装缓存。

如果您使用的是自定义HTTP客户端,则启用缓存的负担就在于调用方。

答案 1 :(得分:4)

据我所知,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();
}

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

相关问题