在Coil中优先使用本地缓存而非网络

4
我正在使用Jetpack Compose中的Coil。我注意到在我的LazyColumn项目中,使用Coil从网络下载的图像(一旦这些图像被缓存)在设备离线时加载得更快。
当设备联网时,似乎Coil仍然会获取网络副本,即使本地已经存在缓存版本的图像。
我希望Coil按照以下顺序优先获取图像:
  1. 检查内存缓存是否存在
  2. 如果不存在,则检查磁盘缓存是否存在
  3. 如果上述两者都不存在,则从网络中获取
如何实现?我的当前ImageRequest Builder如下:
ImageRequest.Builder(LocalContext.current)
  .data(downloadUrl)
  .crossfade(true)
  .crossfade(coilFadeDuration)
  .error(R.drawable.black_color_rectangle)
  .placeholder(R.drawable.placholder)
  .fallback(R.drawable.black_color_rectangle)
  .networkCachePolicy(CachePolicy.ENABLED)
  .diskCachePolicy(CachePolicy.ENABLED)
  .memoryCachePolicy(CachePolicy.ENABLED)
  .diskCacheKey(downloadUrl)
  .memoryCacheKey(downloadUrl)
  .diskCacheKey(downloadUrl)
  .memoryCacheKey(downloadUrl)
  .size(Size.ORIGINAL)
  .build()

你确定吗?按照定义,卷不会下载缓存中已经存在的内容。 - David
LocalContext.current是什么? - David
@David 我确定它会在网络可用时从网络获取数据。我已经通过更改源(服务器)上的图像来测试过了,coil立即获取了更新后的图像。 "LocalContext.current"是上下文。 - Anudeep Ananth
我已经设置了这些标志,并且在我的端上它可以工作,所以你的实现中可能有一些问题,也许尝试删除所有的CacheKey调用。此外,还有一个日志记录功能,您可以在Logcat中查看加载的图像来自哪里,因此您不需要手动更改服务器上的内容来检查某些内容。 - David
1个回答

1

Coil缓存依赖于服务器在首次提供请求时返回的cache-controlexpires HTTP头,以检查是否应该从缓存或服务器加载图像...

如果您无法更改服务器返回的cache-control头值,则仍然可以使用okHttp拦截器重写响应,例如:

ImageLoader.Builder(context)
    .okHttpClient {
        OkHttpClient
            .Builder()
            .addInterceptor { chain ->
                chain.proceed(chain.request())
                    .newBuilder()
                    .removeHeader("cache-control")
                    .removeHeader("expires")
                    .addHeader("cache-control", "public, max-age=604800, no-transform")
                    .build()
            }
            .build()
    }
    .build()

现在您的缓存(内存或磁盘)将在604800秒=1周期间使用,而不是以前由服务器返回的任何max-age值。(在我的情况下,服务器返回1天=86400秒)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接