Android 安卓&x2B;毕加索:更改URL缓存过期时间

Android 安卓&x2B;毕加索:更改URL缓存过期时间,android,caching,picasso,Android,Caching,Picasso,我正在使用毕加索在我的应用程序的所有视图中下载和显示图像。这些图像很少改变(它们被认为在几个月内有效) 有没有一种简单的方法让毕加索(或底层的okHttp)将这些图像保存在光盘上这么长时间 磁盘缓存发生在HTTP客户端的“下方”毕加索。事实上,这个过程是完全透明的。我们从不明确要求缓存版本或internet版本,HTTP客户端将在内部做出决定并做正确的事情 因为我们选择利用HTTP客户机进行缓存,所以我们几乎无法控制缓存的实际发生方式。回答你的问题,不,没有办法告诉毕加索(或OkHttp)将图像

我正在使用毕加索在我的应用程序的所有视图中下载和显示图像。这些图像很少改变(它们被认为在几个月内有效)

有没有一种简单的方法让毕加索(或底层的okHttp)将这些图像保存在光盘上这么长时间

磁盘缓存发生在HTTP客户端的“下方”毕加索。事实上,这个过程是完全透明的。我们从不明确要求缓存版本或internet版本,HTTP客户端将在内部做出决定并做正确的事情


因为我们选择利用HTTP客户机进行缓存,所以我们几乎无法控制缓存的实际发生方式。回答你的问题,不,没有办法告诉毕加索(或OkHttp)将图像缓存的时间超过其头部允许的时间。

我用自制的缓存解决了这个问题,诀窍是在URL中添加一个未使用的参数,但每X分钟使每个URL不同

Calendar cal2 = Calendar.getInstance();
long d = cal2.getTimeInMillis();
int extra =  (int) Math.ceil(d/ (10*60*1000));    // 10 minutes cache

Picasso.with(getBaseContext())
            .load("http://www.myurl.cat/myimage.png&extra=" + extra)
            .placeholder(R.drawable.graphicLoading)
            .error(R.drawable.graphicLoadingError)
            .into(bottomGraphic);

在考虑HTTP行为之前,请确保为磁盘缓存设置了较大的最大大小:

cache = Cache(File(application.filesDir, "photos"), Long.MAX_VALUE)
(不建议在生产中使用最大值。)不要将缓存存储在
application.cacheDir
中,因为android可以随时清除缓存

添加一个拦截器来设置
max stale
,它告诉磁盘缓存使用所有旧文件:

    val httpClient = OkHttpClient.Builder().cache(cache).addInterceptor { chain ->
        // When offline, we always want to show old photos.
        val neverExpireCacheControl = CacheControl.Builder().maxStale(Int.MAX_VALUE, TimeUnit.SECONDS).build()
        val origRequest = chain.request()
        val neverExpireRequest = origRequest.newBuilder().cacheControl(neverExpireCacheControl).build()

        chain.proceed(neverExpireRequest)
    }.build()

    return Picasso.Builder(application).downloader(OkHttp3Downloader(httpClient)).loggingEnabled(true).build()

我通过调试
CacheStrategy.getCandidate()
发现了这个解决方案。如果这不能解决您的问题,请查看那里。

好的。以某种方式允许插入我们自己的缓存逻辑会很好。谢谢你的回答。HTTP有一套定义良好的缓存逻辑。服务器应该提供准确的标题以确保正确的缓存。有些网站返回的图像会立即过期,而它们根本不会更改。添加自定义缓存逻辑可能很困难!这也是我面临的问题。一个调整缓存逻辑的选项将是非常好的,不仅对于这个,而且对于在发展中国家工作的应用程序来说也是如此,在发展中国家,互联网也不是“总是开着”的,这对于保存个人资料图片来说是很好的,现在要实现我自己的方法,这不是只有在缓存过期时间大于您创建的自定义缓存过期时间时才起作用吗?