phicdy devlog

Androidアプリ開発やその他技術系の記事をたまに書きます

AndroidとかiOSとかモバイル多め。その他技術的なことも書いていきます。

coil(というよりOkHttp)でディスクキャッシュのキーをURLから変更するのは難しい

Jetpack Composeでcoilを使うべく調査中。 coilのディスクキャッシュはOkHttpのディスクキャッシュを使っているがそのキーをURLから変更するのは難しそう。

環境

  • coil-compose 1.4.0
  • okhttp 4.9.3

coilのキャッシュ

coil自体はディスクキャッシュの機構は持たず、OkHttpでディスクキャッシュの設定をする。

coil-kt.github.io

val imageLoader = ImageLoader.Builder(context)
    .okHttpClient {
        OkHttpClient.Builder()
            .cache(CoilUtils.createDefaultCache(context))
            .build()
    }
    .build()

メモリキャッシュはcoilの機構があり、キーを自由に指定することができる

coil-kt.github.io

// Get
val bitmap: Bitmap? = imageLoader.memoryCache[memoryCacheKey]

// Set
imageLoader.memoryCache[memoryCacheKey] = bitmap

OkHttpのディスクキャッシュ

OkHttpClient.BuilderのcacheにはCacheクラスのインスタンスを指定する。このクラスはKotlinでopenではないので継承して拡張することはできない。

github.com

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からの移行でここだけが困るなとなった。