Coil — bu nədir, əsas anlayışlar və Android-də ImageLoader

Müəllif: IT Sectr Dərc olunub: 2026-05-05 Oxuma vaxtı: 9 dəq

Coil — Kotlin dilində yazılmış və korutinlər üzərində qurulmuş Android üçün şəkil yükləmə kitabxanasıdır. rəsmi sənədlərə görə, kitabxana Memory Cache, Disk Cache və aparat sürətləndirilməsi ilə transformasiyaları dəstəkləyir. Coil minimal APK ölçüsü (təxminən 150 KB) və Jetpack Compose ilə tam uyğunluğu ilə seçilir.

Əsas məqamlar

  • Coil — Android-də şəkil yükləmə üçün kitabxana, Kotlin Coroutines və Kotlin Serialization istifadə edir.
  • ImageLoader — sorğuları, keşləməni və şəkil transformasiyalarını idarə edən mərkəzi komponent.
  • Memory Cache ani giriş üçün dekodlanmış bitmap şəkillərini operativ yaddaşda saxlayır.
  • Disk Cache oflayn iş və trafikin azaldılması üçün sıxılmış faylları diskdə saxlayır.
  • Jetpack Compose — kitabxana deklarativ UI üçün AsyncImage və SubcomposeAsyncImage dəstəkləyir.

Coil nədir?

Coil (Coroutine Image Loader) — tamamilə Kotlin dilində yazılmış və asinxron iş üçün korutinlərdən istifadə edən Android şəkil yükləmə kitabxanasıdır. O, şəbəkədən, resurslardan, fayl sistemindən və Content Provider-dən bitmap şəkillərini avtomatik çoxsəviyyəli keşləmə ilə yükləmək üçün vahid API təqdim edir.

Glide və Picasso-dan fərqli olaraq, Coil callback zənciri əvəzinə Kotlin Coroutines istifadə edir, bu da kodu daha xətti və proqnozlaşdırıla bilən edir. Bütün yükləmə və dekodlama əməliyyatları Dispatchers.IO vasitəsilə fon thread-lərində yerinə yetirilir və nəticə açıq keçid olmadan əsas thread-ə çatdırılır.

Coil transformasiyaları (Round, Blur, Grayscale), keçid animasiyalarını, SVG və GIF-i, həmçinin qeyri-standart göstərim üçün fərdi Target-i dəstəkləyir. Google I/O 2023-ə görə, Coil Glide ilə bərabər Jetpack Compose üzrə rəsmi dərsliklərdə tövsiyə olunur.

  • APK ölçüsü — təxminən 150 KB (Glide-də 500 KB qarşı)
  • Minimum Android versiyası — API 21 (Lollipop)
  • Asılılıq — Kotlin Coroutines (daxili)

Coil necə işləyir: ImageLoader və ImageRequest

ImageLoader — yükləmə sorğularını yerinə yetirmək və keşi idarə etmək üçün məsul olan Coil-in əsas komponentidir. Hər bir nümunə MemoryCache, DiskCache, BitmapPool və korutin hovuzuna istinadlar ehtiva edir. Varsayılan olaraq Coil.imageLoader(context) vasitəsilə yaradılan sinqletondan istifadə olunur.

ImageRequest

ImageRequest — şəkil yükləmə üçün tək sorğunu təsvir edən obyekt: məlumat mənbəyi (URL, URI, Int resurs), hədəf ImageView və ya Target, transformasiyalar, keşləmə parametrləri və placeholder. ImageRequest builder vasitəsilə yığılır, bu da çeviklik və oxunaqlılığı təmin edir.

kotlin
val request = ImageRequest.Builder(context)
    .data("https://example.com/image.jpg")
    .crossfade(true)
    .size(512, 512)
    .transformations(listOf(RoundedCornersTransformation(12f)))
    .memoryCachePolicy(CachePolicy.ENABLED)
    .diskCachePolicy(CachePolicy.ENABLED)
    .target(imageView)
    .build()

ImageRequest qurulduqdan sonra enqueue və ya execute vasitəsilə ImageLoader-a ötürülür. Enqueue metodu korutin işə salır və ekran tərk edilərkən yükləməni ləğv etməyə imkan verən Disposable qaytarır. Execute metodu birbaşa Result qaytaran suspend-funksiyadır.

Sorğunun yerinə yetirilmə axını

ImageLoader ardıcıl olaraq MemoryCache, DiskCache yoxlayır və yalnız hər ikisində uğursuz olduqda HttpEngine vasitəsilə şəbəkə sorğusu yerinə yetirir. Yükləndikdən sonra baytlar hədəf ölçü nəzərə alınmaqla Bitmap-ə dekodlanır, transformasiyalar tətbiq olunur, nəticə hər iki keşdə saxlanılır və Target-ə ötürülür.

  • Memory Cache — ilk növbədə yoxlanılır, açar — URL + parametrlər
  • Disk Cache — yaddaşda olmadıqda yoxlanılır, açar — URL-in MD5-i
  • HttpEngine — varsayılan olaraq OkHttp, komponent vasitəsilə fərdiləşdirilə bilər

Coil-in əsas komponentləri

Coil Dependency Injection vasitəsilə istənilən hissəni dəyişdirmək imkanı olan komponent arxitekturası üzərində qurulmuşdur. Bütün komponentlər ImageLoaderFactory-da qeydiyyatdan keçirilir və builder vasitəsilə ImageLoader konstruktoruna ötürülür.

ImageLoader

ImageLoader — bütün yükləmə əməliyyatları üçün giriş nöqtəsidir. Hər bir nümunə korutin hovuzu, BitmapPool, MemoryCache, DiskCache və interceptorlar siyahısını ehtiva edir. Varsayılan olaraq bir qlobal nümunə yaradılır, lakin modul testi üçün izolyasiya edilmiş keşlə ayrıca nümunələr yaradıla bilər.

MemoryCache

MemoryCache — dekodlanmış Bitmap obyektlərini saxlayan LRU (Least Recently Used) əsaslı yaddaşdaxili keşdir. Varsayılan maksimum ölçü tətbiqin mövcud yaddaşının 25%-i, lakin 32 MB-dan az deyil. Keş açarı URL + ölçü + transformasiyalardan formalaşır ki, bu da aktual olmayan şəklin verilməsini istisna edir.

DiskCache

DiskCache — xam məlumatlar (JPEG, PNG, WebP) və dekodlanmış metadatalar üçün fayl keşidir. Tətbiqin keş kataloqunda yerləşir və limit aşıldıqda avtomatik təmizləməni dəstəkləyir. Disklə iş kataloq və maksimum ölçü parametrləri ilə DiskCache.Builder vasitəsilə yerinə yetirilir.

Coil-də keşləmə səviyyələri

Coil şəbəkə sorğularını minimuma endirən və şəkillərin göstərilməsini sürətləndirən çoxsəviyyəli keşləmə strategiyasını tətbiq edir. Hər bir səviyyənin öz məqsədi və məlumatların ömür müddəti var.

SəviyyəSaxlama növüÖmür müddətiVarsayılan ölçü
Memory CacheYaddaşda BitmapLRU sıxışdırılana qədər25% heap, 32 MB-dan
Disk CacheJPEG/WebP fayllarıLimit aşılana qədər250 MB
Http CacheOkHttp cavablarıCache-Control başlıqlarına görəHTTP müştərisindən asılıdır

Memory Cache artıq dekodlanmış bitmap-lərə ani girişi təmin edir. Disk Cache ilk yükləmədən sonra tətbiqin şəbəkəsiz (offline-first) işləməsini təmin edir. Http Cache OkHttp səviyyəsində ETag və If-Modified-Since şərti sorğularını emal edir.

Keşləmə siyasətləri sorğu üzrə CachePolicy vasitəsilə üç dəyərlə konfiqurasiya olunur: ENABLED, READ_ONLY, WRITE_ONLY, DISABLED. Məsələn, istifadəçi avatarları üçün Memory Cache üçün READ_ONLY və Disk Cache üçün ENABLED təyin etmək olar.

Kotlin-də Coil istifadə nümunələri

Coil tətbiqin arxitekturasından asılı olaraq bir neçə inteqrasiya üsulu təqdim edir. İşləyən kod nümunələri ilə üç əsas ssenarini nəzərdən keçirək.

ImageView-ə genişləndirmə vasitəsilə yükləmə

load — ImageView üçün genişləndirmə funksiyası, bir sətirdə şəkil yükləməyin ən sadə üsuludur. Funksiya URL, URI, Int resurs və ya File qəbul edir və bütün isteğe bağlı parametrlər lambda konfiquratoru vasitəsilə ötürülür.

kotlin
imageView.load("https://example.com/photo.jpg") {
    crossfade(true)
    placeholder(R.drawable.placeholder)
    error(R.drawable.error)
    size(300, 300)
    transformations(CircleCropTransformation())
}

load metodu onDestroy-də və ya View-in təkrar istifadəsi zamanı ləğv edilə bilən Disposable qaytarır. Bu, sürətli siyahı sürüşdürmə zamanı yaddaş sızmalarının və lazımsız şəbəkə sorğularının qarşısını alır.

Jetpack Compose-da istifadə

AsyncImage — deklarativ UI-də şəkilləri yükləmək üçün composable funksiyası. İstənilən məlumat mənbəyini və vəziyyətlər üçün üç isteğe bağlı parametr qəbul edir: placeholder, error və success.

kotlin
@Composable
fun NetworkImage(url: String) {
    AsyncImage(
        model = url,
        contentDescription = "şəbəkə şəkli",
        placeholder = ColorPainter(Color.Gray),
        error = ColorPainter(Color.Red)
    )
}

SubcomposeAsyncImage — content slot vasitəsilə yükləmə zamanı göstərimi fərdiləşdirməyə imkan verən daha çevik versiyadır. Bu, skeleton (shimmer) və gedişat çubuqları üçün faydalıdır.

Qeyri-standart çıxış üçün fərdi Target

ImageView və ya AsyncImage uyğun deyilsə, Bitmap qəbul edən tək onSuccess metodu olan Target tətbiq edilə bilər. Bu, Notification, RemoteViews və ya OpenGL teksturasına yükləmə üçün istifadə olunur.

kotlin
val target = object : BitmapTarget() {
    override fun onSuccess(result: Bitmap) {
        notificationRemoteView.setImageViewBitmap(R.id.icon, result)
    }
}

imageLoader.enqueue(
    ImageRequest.Builder(context)
        .data(url)
        .target(target)
        .build()
)

Coil-in digər kitabxanalarla müqayisəsi

Şəkil yükləmə kitabxanasının seçimi layihənin tələblərindən asılıdır. Coil hər birinin güclü tərəfləri olan Glide və Picasso ilə rəqabət aparır. Əsas xüsusiyyətlərin müqayisəsi cədvəldə verilmişdir.

XüsusiyyətCoilGlidePicasso
DilKotlin (100%)Java + KotlinJava
APK ölçüsü~150 KB~500 KB~120 KB
KorutinlərDaxiliXeyr (callback)Xeyr (callback)
Jetpack ComposeYerli dəstəkAccompaniment vasitəsiləÜçüncü tərəf
GIF/WebPBəli (daxili)Bəli (daxili)Xeyr
Google tövsiyəsiBəli (I/O 2023)BəliXeyr

Kotlin və Jetpack Compose-də yeni layihələr üçün Coil korutinlərdən sıfır əlavə asılılıq və minimal ölçü sayəsində təbii seçim olur. Glide animasiyalar və video önizləmələri olan mürəkkəb ssenarilər üçün üstünlük təşkil edir. Picasso hər ikisindən funksionallıq baxımından geri qalır, lakin sadəliyi ilə qalib gəlir.

Android layihəsində Coil-in qurulması

Coil-in Android layihəsinə qoşulması Gradle asılılığı vasitəsilə həyata keçirilir. Kitabxana əlavə edildikdən sonra ContentProvider vasitəsilə ImageLoader-ı avtomatik qeydiyyatdan keçirir, buna görə də Application-da əl ilə işə salma tələb olunmur. Fərdiləşdirmə lazım olduqda builder vasitəsilə öz ImageLoader yaradılır.

kotlin
// build.gradle.kts (tətbiq modulu)
dependencies {
    implementation("io.coil-kt:coil:2.6.0")
    // Jetpack Compose üçün əlavə:
    implementation("io.coil-kt:coil-compose:2.6.0")
    // SVG dəstəyi üçün:
    implementation("io.coil-kt:coil-svg:2.6.0")
    // GIF dəstəyi üçün:
    implementation("io.coil-kt:coil-gif:2.6.0")
}

ImageLoader-ı fərdiləşdirmək üçün Application.onCreate-də yaradılan sinqlton olan ImageLoaderFactory istifadə olunur. Fabrikdə keş limitlərini, HTTP müştərisini, fərdi dekoderləri və loglaşdırmanı konfiqurasiya etmək olar. Varsayılan olaraq Coil hazır birləşmə hovuzu ilə OkHttp istifadə edir.

kotlin
class App : Application(), ImageLoaderFactory {
    override fun newImageLoader(): ImageLoader {
        return ImageLoader.Builder(this)
            .memoryCache {
                MemoryCache.Builder()
                    .maxSizePercent(0.25)
                    .build()
            }
            .diskCache {
                DiskCache.Builder()
                    .directory(cacheDir.resolve("coil_cache"))
                    .maxSizeBytes(512 * 1024 * 1024)
                    .build()
            }
            .build()
    }
}

Tez-tez verilən suallar

Coil nədir və nə üçün istifadə olunur?

Coil — Kotlin dilində korutinlərdən istifadə edərək yazılmış Android üçün şəkil yükləmə kitabxanasıdır. Şəbəkədən, resurslardan və ya fayl sistemindən bitmap şəkillərinin asinxron yüklənməsi, keşlənməsi və göstərilməsi üçün istifadə olunur.

Coil Glide-dən nə ilə fərqlənir?

Coil 100% Kotlin dilində yazılmışdır və Glide-dəki callback mexanizmi əvəzinə korutinlər istifadə edir. Coil daha kiçik APK ölçüsünə (~150 KB ~500 KB qarşı) və AsyncImage vasitəsilə Jetpack Compose üçün yerli dəstəyə malikdir.

Kotlin layihəsinə Coil-i necə əlavə etmək olar?

build.gradle.kts faylına io.coil-kt:coil:2.6.0 asılılığını əlavə edin. Jetpack Compose üçün həmçinin io.coil-kt:coil-compose:2.6.0 əlavə edin. Kitabxana ContentProvider vasitəsilə ImageLoader-ı avtomatik qeydiyyatdan keçirir.

Coil hansı şəkil növlərini dəstəkləyir?

Coil JPEG, PNG, WebP, BMP, SVG (coil-svg modulu vasitəsilə) və GIF (coil-gif modulu vasitəsilə) dəstəkləyir. AVIF və HEIF formatları Android 10+ olan cihazlarda fərdi dekoder vasitəsilə dəstəklənir.

Coil-də keşi necə konfiqurasiya etmək olar?

Keş ImageLoader.Builder vasitəsilə konfiqurasiya olunur: memoryCache heap-dən faiz göstərilməklə, diskCache yol və baytla limit göstərilməklə. Keş siyasətləri (ENABLED, DISABLED, READ_ONLY) CachePolicy vasitəsilə sorğu üzrə konfiqurasiya olunur.

Nəticə

  • Coil — korutinlər və Jetpack Compose üçün tam dəstək ilə Kotlin-də şəkil yükləmə kitabxanası.
  • ImageLoader sorğuları, keşləməni və transformasiyaları idarə edir, iki keş səviyyəsindən istifadə edir: Memory Cache və Disk Cache.
  • AsyncImageSubcomposeAsyncImage placeholder, error və success vəziyyətlərini dəstəkləyərək Compose ilə inteqrasiya təmin edir.
  • APK ölçüsü ~150 KB Coil-i bazarda ən yığcam şəkil yükləmə kitabxanalarından birinə çevirir.
  • Transformasiyalar (RoundedCorners, CircleCrop, Blur) kitabxanaya daxildir və aparat sürətləndirilməsi ilə işləyir.
  • Disk Cache konfiqurasiya olunan saxlama limiti ilə əvvəllər yüklənmiş şəkillərə oflayn girişi təmin edir.
  • Coil Google tərəfindən tövsiyə olunur Jetpack Compose üzrə rəsmi təlimatlarda, bu da onun müasir standart statusunu təsdiqləyir.

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun