You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Compose使用Coil设置SVG图片20秒缓存有效期不生效问题

问题原因分析
  • 缓存控制逻辑搞反:HTTP 缓存的有效期由响应头的Cache-Control决定,你当前只在请求头添加了max-age=20,不会影响最终缓存生效时长,只有服务端返回的响应头或者本地拦截器重写的响应头配置才会生效。
  • 全局拦截器冲突:你全局OkHttp配置里传入了provideCacheInterceptor(10),硬编码了10秒缓存时长,该拦截器会覆盖你单请求设置的缓存规则,且时长不符合需求。
  • 旧缓存残留:如果测试前已经用旧配置下载过图片,旧缓存会沿用之前的过期规则,不会自动更新有效期。
解决方案

1. 修改缓存拦截器逻辑

首先调整拦截器,改为重写响应头的缓存规则,支持读取请求自定义的缓存时长,避免硬编码:

fun provideDynamicCacheInterceptor(): Interceptor {
    return Interceptor { chain ->
        val request = chain.request()
        // 读取请求自定义的缓存时长头,默认20秒
        val maxAge = request.header("X-Custom-Max-Age")?.toIntOrNull() ?: 20
        val response = chain.proceed(request)
        // 重写响应缓存头,强制生效
        response.newBuilder()
            .removeHeader("Pragma")
            .removeHeader("Cache-Control") // 移除服务端返回的原有缓存头
            .header("Cache-Control", "public, max-age=$maxAge")
            .build()
    }
}

2. 修正全局ImageLoader配置

移除原来硬编码10秒的拦截器,替换为上面的动态缓存拦截器:

val imageLoader = ImageLoader.Builder(applicationContext)
    .componentRegistry {
        add(SvgDecoder(applicationContext))
    }
    .okHttpClient {
        OkHttpClient.Builder()
            .cache(CoilUtils.createDefaultCache(applicationContext))
            .addNetworkInterceptor(provideDynamicCacheInterceptor()) // 替换为新的拦截器
            .build()
    }
    .memoryCachePolicy(CachePolicy.DISABLED)
    .diskCachePolicy(CachePolicy.ENABLED)
    .build()

Coil.setImageLoader(imageLoader = imageLoader)

3. 调整业务请求代码

请求时添加自定义的缓存时长头即可,不需要再加默认的Cache-Control请求头:

val singleInstanceImageLoader = context.imageLoader
val imageRequest = ImageRequest.Builder(context)
    .data(decodedURL)
    .memoryCachePolicy(CachePolicy.DISABLED)
    .diskCachePolicy(CachePolicy.ENABLED)
    .addHeader("X-Custom-Max-Age", "20") // 自定义缓存时长为20秒
    .build()

// 建议升级Coil到最新版本,使用rememberAsyncImagePainter替代废弃的rememberCoilPainter
val imagePainter = rememberAsyncImagePainter(
    model = imageRequest,
    imageLoader = singleInstanceImageLoader
)

Image(
    painter = imagePainter,
    contentDescription = null,
    modifier = Modifier
        .wrapContentSize(Alignment.Center)
        .padding(0.dp, 15.dp, 0.dp, 15.dp)
)

4. 测试注意事项

修改后先卸载应用清理原有旧缓存,再重新安装测试,避免旧缓存干扰验证结果。

内容的提问来源于stack exchange,提问作者CavinAndro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 02:42:04