Skip to content

이미지 로더

ImageLoaderImageRequest를 실행하는 서비스 객체입니다. 캐싱, 데이터 가져오기, 이미지 디코딩, 요청 관리, 메모리 관리 등 다양한 작업을 처리합니다.

Coil은 단일 ImageLoader를 생성하고 앱 전체에서 공유할 때 최상의 성능을 발휘합니다. 이는 각 ImageLoader가 자체 메모리 캐시, 디스크 캐시 및 OkHttpClient를 가지고 있기 때문입니다.

싱글턴

기본 io.coil-kt.coil3:coil 아티팩트에는 싱글턴 ImageLoader가 함께 제공됩니다. Coil은 이 ImageLoader를 지연 생성합니다. 다음을 포함한 여러 가지 방법으로 구성할 수 있습니다:

kotlin
// setSafe 메서드는 이미 생성된 이미지 로더를 덮어쓰지 않도록 합니다.
SingletonImageLoader.setSafe {
    ImageLoader.Builder(context)
        .crossfade(true)
        .build()
}

// Compose Multiplatform 앱에 유용한 SingletonImageLoader.setSafe의 별칭입니다.
setSingletonImageLoaderFactory { context ->
    ImageLoader.Builder(context)
        .crossfade(true)
        .build()
}

// 테스트에서만 사용해야 합니다. 이 메서드를 여러 번 호출하면
// 여러 이미지 로더가 생성됩니다.
SingletonImageLoader.setUnsafe {
    ImageLoader.Builder(context)
        .crossfade(true)
        .build()
}

// Android에서는 Application 클래스에 SingletonImageLoader.Factory를 구현하여
// 싱글턴 이미지 로더를 생성하도록 할 수 있습니다.
class CustomApplication : SingletonImageLoader.Factory {
    override fun newImageLoader(context: Context): ImageLoader {
        return ImageLoader.Builder(context)
            .crossfade(true)
            .build()
    }
}

모든 경우에 위에 언급된 메서드는 앱 시작 시 (즉, Application.onCreate 내부 또는 앱이 단일 Activity인 경우 MainActivity.onCreate 내부) 가능한 한 빨리 호출되도록 해야 합니다.

의존성 주입

앱이 더 크거나 자체 ImageLoader를 관리하고 싶다면 io.coil-kt.coil3:coil 대신 io.coil-kt.coil3:coil-core에 의존할 수 있습니다.

이 방법은 가짜 ImageLoader의 수명 주기 범위를 지정하는 것을 훨씬 더 쉽게 만들고, 전반적으로 테스트를 더 쉽게 만듭니다.

캐싱

ImageLoader는 최근 디코딩된 Bitmap에 대한 메모리 캐시와 인터넷에서 로드된 이미지에 대한 디스크 캐시를 유지합니다. 둘 다 ImageLoader를 생성할 때 구성할 수 있습니다:

kotlin
val imageLoader = ImageLoader.Builder(context)
    .memoryCache {
        MemoryCache.Builder(context)
            .maxSizePercent(0.25)
            .build()
    }
    .diskCache {
        DiskCache.Builder()
            .directory(context.cacheDir.resolve("image_cache"))
            .maxSizePercent(0.02)
            .build()
    }
    .build()

메모리 및 디스크 캐시의 항목은 이미지가 로드된 후 ImageResult로 반환되는 키를 사용하여 접근할 수 있습니다. ImageResultImageLoader.execute에 의해 또는 ImageRequest.Listener.onSuccessImageRequest.Listener.onError에서 반환됩니다.