毕加索如何实际缓存图像

Aun*_*yae 9 android image-loading picasso

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

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

问题是我的项目是从网络上加载大量的小图像.有时,新图像会在下次发布时反映出来.但是,有时候,事实并非如此.

最糟糕的是,一些图像反映了变化,而其他图像则不是同时发生的变化.
但是,当我卸载App时,所有图像都反映了这些变化(当然.)

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

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

无论如何,任何想法或指针将不胜感激.
底线:没有OkHttp.只想了解Picasso上的缓存控制机制.

问候

Jak*_*ton 16

毕加索只有一个内存缓存.

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

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

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

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


Cip*_*ian 4

据我所知,毕加索不会自行清除缓存,因此在我们的应用程序中,我们“手动”触发该操作。执行此操作的代码是这样的:

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();
}
Run Code Online (Sandbox Code Playgroud)

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

  • 仅当您使用 OkHttp 或 HttpUrlConnection 时,这才有效,而帖子明确指出他不是。 (3认同)