Android + Picasso:更改URL缓存过期

时间:2013-10-02 07:57:52

标签: android caching picasso

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

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

3 个答案:

答案 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()发现了该解决方案。如果这不能解决您的问题,请去那里看看。