在 Coil 2.0.0中,网络缓存的使用得到了显着简化,但尚未发布 - 目前的最新版本是2.0.0-alpha08。
指定diskCacheKey
和memoryCacheKey
,rememberAsyncImagePainter
也key
仍然需要触发重组。
val context = LocalContext.current
key(key) {
Image(
rememberAsyncImagePainter(
remember(url) {
ImageRequest.Builder(context)
.data(url)
.diskCacheKey(url)
.memoryCacheKey(url)
.build()
}
),
null
)
}
并使用图像加载器清除缓存:
val imageLoader = context.imageLoader
imageLoader.diskCache?.remove(url)
imageLoader.memoryCache?.remove(MemoryCache.Key(url))
线圈1.4.0的答案
线圈有两个级别的缓存:
对于网络调用,Coil 使用 OkHttp,要访问它的缓存,您需要手动创建它,如文档中所示。我认为在这种情况下,最好将缓存和图像加载器都存储在 DI 中,但您也可以创建一个本地组合以从任何可组合访问此缓存:
val LocalCoilHttpCache = staticCompositionLocalOf<Cache> {
error("coilHttpCache not provided")
}
在您的活动/片段中提供它:
val cache = CoilUtils.createDefaultCache(this)
val imageLoader = ImageLoader.Builder(this)
.okHttpClient {
OkHttpClient.Builder()
.cache(cache)
.build()
}
.build()
setContent {
CompositionLocalProvider(
LocalImageLoader provides imageLoader,
LocalCoilHttpCache provides cache,
) {
// your application
}
}
以任何可组合的方式获取它
val httpCache = LocalCoilHttpCache.current
然后,无论您将其存储在 DI 中还是本地组合中,都可以使用以下代码清除必要的缓存:
val urlIterator = httpCache.urls()
while (urlIterator.hasNext()) {
if (urlIterator.next() == urlToRemove) {
urlIterator.remove()
}
}
从网络下载图像后,将其转换为Bitmap
. 这些位图使用Memory cache进行缓存,因此您也需要清除它。根据文档,最简单的方法是指定一个缓存键,例如 URL:
rememberImagePainter(
url,
builder = {
memoryCacheKey(MemoryCache.Key(url))
}
),
然后你可以清理它:
val loader = LocalImageLoader.current
// or out of composable
val loader = Coil.imageLoader(context)
// ..
loader.memoryCache.remove(MemoryCache.Key(url))
最后一步是强制图像重组。您可以使用 来执行此操作key
,指定要更改的值,在您的情况下profileImgKey
应该可以:
key(profileImgKey) {
Image(
rememberImagePainter(
// ...