9

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

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

4

3 回答 3

14

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

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

于 2013-10-03T16:29:13.590 回答
4

我用自制缓存解决了这个问题,诀窍是在未使用的 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);
于 2014-09-28T08:52:44.313 回答
1

在考虑 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()。如果这不能解决您的问题,请查看那里。

于 2019-08-17T00:53:03.867 回答