线圈图像缓存不适用于 Jetpack Compose

lok*_*esh 8 android android-jetpack-compose coil jetpack-compose-accompanist

我正在使用线圈(版本 2.1.0)从 URL 加载图像。当有网络连接时,图像加载正常。但是,当没有网络连接时,图像不会像我预期的那样从缓存中提取。这是我的一段代码。

class App : Application(), ImageLoaderFactory {

    override fun newImageLoader(): ImageLoader {
       return ImageLoader.Builder(this)
            .memoryCache {
                MemoryCache.Builder(this)
                    .maxSizePercent(0.25)
                    .build()
            }
            .diskCache {
                DiskCache.Builder()
                    .directory(cacheDir.resolve("image_cache"))
                    .maxSizeBytes(5 * 1024 * 1024)
                    .build()
            }
            .build()
    }
  }

Run Code Online (Sandbox Code Playgroud)

在撰写中:

                val context = LocalContext.current
                val placeholderImage = R.drawable.ic_placeholder
    
                val imageRequest = ImageRequest.Builder(context)
                    .data(imageUrl)
                    .memoryCacheKey(imageUrl)
                    .diskCacheKey(imageUrl)
                    .placeholder(placeholderImage)
                    .error(placeholderImage)
                    .fallback(placeholderImage)
                    .diskCachePolicy(CachePolicy.ENABLED)
                    .memoryCachePolicy(CachePolicy.ENABLED)
                    .transformations(CircleCropTransformation())
                    .build()

                AsyncImage(
                    model = imageRequest,
                    modifier = Modifier.size(64.dp),
                    contentDescription = null,
                    imageLoader = context.imageLoader
                )

Run Code Online (Sandbox Code Playgroud)

当设备离线时,它仅加载占位符图像,而不是按预期从缓存中加载图像。我在这里缺少什么?

lok*_*esh 15

logger(DebugLogger())在 ImageLoader 中使用来弄清楚发生了什么,我发现当 Coil 尝试离线加载图像时,应用程序遇到了 HTTP 504 错误。所以我添加.respectCacheHeaders(false)到ImageLoader中。这似乎对我有用。

希望这可以帮助遇到类似问题的其他人。

  • @IgorGanapolsky ```val imageLoader = ImageLoader.Builder(context).components { add(ImageDecoderDecoder.Factory()) }.respectCacheHeaders(false).build()``` 然后将其传递给像这样的 Image ```Image (画家 = RememberAsyncImagePainter(imageRequest, imageLoader = imageLoader), contentDescription = null)``` (2认同)