我正在使用 Picasso 下载并在我的应用程序的所有视图中显示图像。这些图像很少更改(它们被认为在几个月内有效)。
有没有一种简单的方法可以让 Picasso(或底层的 okHttp)将这些图像保存在磁盘上这么长时间?
磁盘缓存发生在 HTTP 客户端内的“下方”毕加索。事实上,这个过程是完全透明的。我们从不明确要求缓存版本或互联网版本,HTTP 客户端将在内部做出决定并做正确的事情。
因为我们选择利用 HTTP 客户端进行缓存,所以我们几乎无法控制缓存的实际发生方式。要回答您的问题,不,没有办法告诉 Picasso(或 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)
(不建议将 MAX_VALUE 用于生产。)不要将缓存存储在 中application.cacheDir
,因为 android 可以随时清除它。
向 set 添加一个拦截器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()
。如果这不能解决您的问题,请查看那里。