ネットワーク画像
デフォルトでは、Coil 3.x はネットワークからの画像読み込みをサポートしていません。これは、独自のネットワーキングソリューションを使用したいユーザーや、ネットワークURLのサポートを必要としないユーザー(例えば、ディスクからのみ画像を読み込む場合)に、大きなネットワーキング依存関係を強制することを避けるためです。
ネットワークから画像をフェッチするサポートを追加するには、以下のいずれか1つのみをインポートしてください:
implementation("io.coil-kt.coil3:coil-network-okhttp:3.3.0") // Only available on Android/JVM.
implementation("io.coil-kt.coil3:coil-network-ktor2:3.3.0")
implementation("io.coil-kt.coil3:coil-network-ktor3:3.3.0")OkHttp を使用する場合、これだけです。インポートすると、https://example.com/image.jpg のようなネットワークURLは自動的にサポートされます。Ktor を使用する場合は、プラットフォームごとにサポートされているエンジンを追加する必要があります(下記参照)。
Ktor ネットワークエンジン
coil-network-ktor2 または coil-network-ktor3 に依存する場合、各プラットフォーム(JavaScriptを除く)向けに Ktor エンジン をインポートする必要があります。以下にエンジンのクイックスタートセットを示します:
androidMain {
dependencies {
implementation("io.ktor:ktor-client-android:<ktor-version>")
}
}
appleMain {
dependencies {
implementation("io.ktor:ktor-client-darwin:<ktor-version>")
}
}
jvmMain {
dependencies {
implementation("io.ktor:ktor-client-java:<ktor-version>")
}
}カスタムのネットワーキングライブラリを使用したい場合、io.coil-kt.coil3:coil-network-core をインポートし、NetworkClient を実装し、ImageLoader 内でカスタムの NetworkClient を使って NetworkFetcher を登録することができます。
カスタム OkHttpClient の使用
io.coil-kt.coil3:coil-network-okhttp を使用する場合、ImageLoader を作成する際にカスタムの OkHttpClient を指定できます:
val imageLoader = ImageLoader.Builder(context)
.components {
add(
OkHttpNetworkFetcherFactory(
callFactory = {
OkHttpClient()
}
)
)
}
.build()!!! 注 既にビルド済みの OkHttpClient がある場合、元のクライアントとリソースを共有する新しいクライアントをビルドするには、newBuilder() を使用してください。
Cache-Control のサポート
デフォルトでは、Coil 3.x は Cache-Control ヘッダーを尊重せず、常にレスポンスをディスクキャッシュに保存します。
io.coil-kt.coil3:coil-network-cache-control には、CacheStrategy の実装が含まれており、これにより、NetworkFetcher がネットワークレスポンスの Cache-Control ヘッダー を尊重するようになります。
CacheControlCacheStrategy を NetworkFetcher に渡してから、カスタムの NetworkFetcher を ImageLoader に登録してください:
OkHttpNetworkFetcherFactory(
cacheStrategy = { CacheControlCacheStrategy() },
)!!! 注 Android API レベル 25 以下をサポートするには、coreLibraryDesugaring を有効にする必要があります。有効にするには、こちらのドキュメント に従ってください。
ヘッダー
ヘッダーは、画像リクエストに以下の2つの方法のいずれかで追加できます。単一のリクエストに対してヘッダーを設定できます:
val headers = NetworkHeaders.Builder()
.set("Cache-Control", "no-cache")
.build()
val request = ImageRequest.Builder(context)
.data("https://example.com/image.jpg")
.httpHeaders(headers)
.target(imageView)
.build()
imageLoader.execute(request)または、OkHttp Interceptor を作成して、ImageLoader が実行するすべてのリクエストにヘッダーを設定できます:
class RequestHeaderInterceptor(
private val name: String,
private val value: String,
) : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val headers = Headers.Builder()
.set("Cache-Control", "no-cache")
.build()
val request = chain.request().newBuilder()
.headers(headers)
.build()
return chain.proceed(request)
}
}
val imageLoader = ImageLoader.Builder(context)
.components {
add(
OkHttpNetworkFetcher(
callFactory = {
OkHttpClient.Builder()
// This header will be added to every image request.
.addNetworkInterceptor(RequestHeaderInterceptor("Cache-Control", "no-cache"))
.build()
},
)
)
}
.build()