coil(というよりOkHttp)でディスクキャッシュのキーをURLから変更するのは難しい
Jetpack Composeでcoilを使うべく調査中。 coilのディスクキャッシュはOkHttpのディスクキャッシュを使っているがそのキーをURLから変更するのは難しそう。
環境
- coil-compose 1.4.0
- okhttp 4.9.3
coilのキャッシュ
coil自体はディスクキャッシュの機構は持たず、OkHttpでディスクキャッシュの設定をする。
val imageLoader = ImageLoader.Builder(context)
.okHttpClient {
OkHttpClient.Builder()
.cache(CoilUtils.createDefaultCache(context))
.build()
}
.build()
メモリキャッシュはcoilの機構があり、キーを自由に指定することができる
// Get val bitmap: Bitmap? = imageLoader.memoryCache[memoryCacheKey] // Set imageLoader.memoryCache[memoryCacheKey] = bitmap
OkHttpのディスクキャッシュ
OkHttpClient.BuilderのcacheにはCacheクラスのインスタンスを指定する。このクラスはKotlinでopenではないので継承して拡張することはできない。
Cacheクラスは内部でinternalなDiskLruCacheを持ちinternalなputメソッドでeditをしている。ここにキーとして渡しているのがリクエストのURLになっている。internalなため外からキャッシュに追加することはできない。
internal fun put(response: Response): CacheRequest? { ... val entry = Entry(response) var editor: DiskLruCache.Editor? = null try { editor = cache.edit(key(response.request.url)) ?: return null entry.writeTo(editor) return RealCacheRequest(editor) } catch (_: IOException) { abortQuietly(editor) return null } }
ちなみに削除のremoveもinternalのためキーを指定して行うことができない。全削除するdeleteのみが公開されている。
キーを変えたい場合はどうするか?
- キーとしたい値が変わったタイミングでディスクキャッシュを全部削除する
- メモリキャッシュで我慢する
- Glideを使いAndroidViewにする
あたりかなと思う。
Glideからの移行でここだけが困るなとなった。