我正在使用Picasso在我的应用程序中下载和显示视图中的图像。这些图像很少变化(它们被认为有效几个月)。
有没有一种简单的方法可以让Picasso(或底层的okHttp)将这些图像保存在光盘上这么长时间?
答案 0 :(得分:13)
磁盘缓存发生在HTTP客户端内的Picasso“下方”。实际上,这个过程是完全透明的。我们从未明确要求缓存版本或互联网版本,HTTP客户端将在内部做出决定并做正确的事情。
因为我们选择利用HTTP客户端进行缓存,所以我们几乎无法控制缓存的实际发生方式。要回答你的问题,不,没有办法告诉Picasso(或OkHttp)缓存图像的时间超过其标题所允许的范围。
答案 1 :(得分:3)
我用自制缓存解决了它,诀窍是在未使用的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);
答案 2 :(得分:1)
在考虑HTTP行为之前,请确保为磁盘缓存设置了较大的最大大小:
cache = Cache(File(application.filesDir, "photos"), Long.MAX_VALUE)
(不建议在生产环境中使用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()
发现了该解决方案。如果这不能解决您的问题,请去那里看看。