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 (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.
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 — şə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.
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.
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.
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 — 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 — 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 — 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 şə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əti | Varsayılan ölçü |
|---|---|---|---|
| Memory Cache | Yaddaşda Bitmap | LRU sıxışdırılana qədər | 25% heap, 32 MB-dan |
| Disk Cache | JPEG/WebP faylları | Limit aşılana qədər | 250 MB |
| Http Cache | OkHttp 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.
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.
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.
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.
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.
@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.
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.
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()
)
Şə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ət | Coil | Glide | Picasso |
|---|---|---|---|
| Dil | Kotlin (100%) | Java + Kotlin | Java |
| APK ölçüsü | ~150 KB | ~500 KB | ~120 KB |
| Korutinlər | Daxili | Xeyr (callback) | Xeyr (callback) |
| Jetpack Compose | Yerli dəstək | Accompaniment vasitəsilə | Üçüncü tərəf |
| GIF/WebP | Bəli (daxili) | Bəli (daxili) | Xeyr |
| Google tövsiyəsi | Bəli (I/O 2023) | Bəli | Xeyr |
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.
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.
// 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.
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 — 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 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.
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 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.
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ə
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.
Həm də oxuyun