Coil — यह क्या है, मुख्य अवधारणाएँ और Android में ImageLoader

लेखक: IT Sectr प्रकाशित: 2026-05-05 पढ़ने का समय: 9 मिनट

Coil Android पर इमेज लोड करने के लिए एक लाइब्रेरी है, जो Kotlin में लिखी गई है और coroutines पर आधारित है। आधिकारिक दस्तावेज़ीकरण के अनुसार, लाइब्रेरी Memory Cache, Disk Cache और हार्डवेयर-त्वरित ट्रांसफ़ॉर्मेशन का समर्थन करती है। Coil अपने न्यूनतम APK आकार (लगभग 150 KB) और Jetpack Compose के साथ पूर्ण संगतता के लिए जानी जाती है।

मुख्य बातें

  • Coil Android पर इमेज लोड करने के लिए एक लाइब्रेरी है जो Kotlin Coroutines और Kotlin Serialization का उपयोग करती है।
  • ImageLoader केंद्रीय घटक है जो अनुरोधों, कैशिंग और इमेज ट्रांसफ़ॉर्मेशन का प्रबंधन करता है।
  • Memory Cache तत्काल पहुँच के लिए डिकोड की गई बिटमैप इमेज को RAM में संग्रहीत करता है।
  • Disk Cache ऑफलाइन काम और ट्रैफ़िक कम करने के लिए स्टोरेज पर संपीड़ित फ़ाइलों को सहेजता है।
  • Jetpack Compose — लाइब्रेरी घोषणात्मक UI के लिए AsyncImage और SubcomposeAsyncImage का समर्थन करती है।

Coil क्या है?

Coil (Coroutine Image Loader) Android पर इमेज लोड करने के लिए एक लाइब्रेरी है, जो पूरी तरह से Kotlin में लिखी गई है और एसिंक्रोनस संचालन के लिए coroutines का उपयोग करती है। यह नेटवर्क, संसाधनों, फ़ाइल सिस्टम और Content Provider से बिटमैप इमेज लोड करने के लिए एक एकीकृत API प्रदान करती है, जिसमें स्वचालित बहु-स्तरीय कैशिंग होती है।

Glide और Picasso के विपरीत, Coil कॉलबैक श्रृंखलाओं के बजाय Kotlin Coroutines का उपयोग करता है, जो कोड को अधिक रैखिक और पूर्वानुमानित बनाता है। सभी लोडिंग और डिकोडिंग संचालन Dispatchers.IO डिस्पैचर के माध्यम से बैकग्राउंड थ्रेड पर निष्पादित होते हैं, और परिणाम स्पष्ट स्विचिंग के बिना मुख्य थ्रेड पर वितरित किए जाते हैं।

Coil ट्रांसफ़ॉर्मेशन (Round, Blur, Grayscale), ट्रांज़िशन एनिमेशन, SVG और GIF, साथ ही गैर-मानक प्रदर्शन के लिए कस्टम Targets का समर्थन करता है। Google I/O 2023 के अनुसार, Coil को Glide के साथ आधिकारिक Jetpack Compose ट्यूटोरियल में अनुशंसित किया गया है।

  • APK आकार — लगभग 150 KB (Glide के 500 KB की तुलना में)
  • न्यूनतम Android संस्करण — API 21 (Lollipop)
  • निर्भरता — Kotlin Coroutines (अंतर्निहित)

Coil कैसे काम करता है: ImageLoader और ImageRequest

ImageLoader Coil का मुख्य घटक है, जो लोडिंग अनुरोधों को निष्पादित करने और कैश प्रबंधित करने के लिए जिम्मेदार है। प्रत्येक इंस्टेंस में MemoryCache, DiskCache, BitmapPool और coroutine पूल के संदर्भ होते हैं। डिफ़ॉल्ट रूप से, Coil.imageLoader(context) के माध्यम से बनाया गया एक सिंगलटन उपयोग किया जाता है।

ImageRequest

ImageRequest एक ऑब्जेक्ट है जो एकल इमेज लोडिंग अनुरोध का वर्णन करता है: डेटा स्रोत (URL, URI, Int संसाधन), लक्ष्य ImageView या Target, ट्रांसफ़ॉर्मेशन, कैशिंग सेटिंग्स और placeholder। ImageRequest एक बिल्डर के माध्यम से बनाया जाता है, जो लचीलापन और पठनीयता सुनिश्चित करता है।

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 को enqueue या execute के माध्यम से ImageLoader को भेजा जाता है। enqueue विधि एक coroutine शुरू करती है और एक Disposable लौटाती है, जो स्क्रीन छोड़ने पर लोडिंग रद्द करने की अनुमति देती है। execute विधि एक suspend फ़ंक्शन है जो सीधे Result लौटाता है।

अनुरोध निष्पादन प्रवाह

ImageLoader क्रमिक रूप से MemoryCache, DiskCache की जाँच करता है, और केवल दोनों के मिस होने पर HttpEngine के माध्यम से नेटवर्क अनुरोध निष्पादित करता है। लोड करने के बाद, बाइट्स को लक्ष्य आकार को ध्यान में रखते हुए Bitmap में डिकोड किया जाता है, ट्रांसफ़ॉर्मेशन लागू किए जाते हैं, परिणाम दोनों कैश में संग्रहीत किया जाता है और Target को भेजा जाता है।

  • Memory Cache — पहले जाँचा जाता है, कुंजी URL + पैरामीटर है
  • Disk Cache — मेमोरी मिस होने पर जाँचा जाता है, कुंजी URL का MD5 है
  • HttpEngine — डिफ़ॉल्ट रूप से OkHttp, घटक के माध्यम से अनुकूलन योग्य

Coil के मुख्य घटक

Coil एक घटक आर्किटेक्चर पर बनाया गया है जिसमें डिपेंडेंसी इंजेक्शन के माध्यम से किसी भी भाग को बदलने की क्षमता है। सभी घटक ImageLoaderFactory में पंजीकृत होते हैं और बिल्डर के माध्यम से ImageLoader कंस्ट्रक्टर को भेजे जाते हैं।

ImageLoader

ImageLoader सभी लोडिंग संचालन के लिए प्रवेश बिंदु है। प्रत्येक इंस्टेंस में coroutine पूल, BitmapPool, MemoryCache, DiskCache और इंटरसेप्टर्स की एक सूची होती है। डिफ़ॉल्ट रूप से, एक वैश्विक इंस्टेंस बनाया जाता है, लेकिन यूनिट परीक्षण के लिए, अलग-अलग कैश वाले अलग इंस्टेंस बनाए जा सकते हैं।

MemoryCache

MemoryCache LRU (Least Recently Used) पर आधारित एक इन-मेमोरी कैश है जो डिकोड की गई Bitmap ऑब्जेक्ट्स को संग्रहीत करता है। डिफ़ॉल्ट अधिकतम आकार उपलब्ध एप्लिकेशन मेमोरी का 25% है, लेकिन 32 MB से कम नहीं। कैश कुंजी URL + आकार + ट्रांसफ़ॉर्मेशन से बनती है, जो पुरानी इमेज पुनर्प्राप्ति को रोकती है।

DiskCache

DiskCache कच्चे डेटा (JPEG, PNG, WebP) और डिकोड की गई मेटाडेटा के लिए एक फ़ाइल-आधारित कैश है। यह एप्लिकेशन की कैश निर्देशिका में स्थित होता है और सीमा पार होने पर स्वचालित सफाई का समर्थन करता है। डिस्क संचालन DiskCache.Builder के माध्यम से निर्देशिका और अधिकतम आकार कॉन्फ़िगरेशन के साथ किया जाता है।

Coil में कैशिंग स्तर

Coil एक बहु-स्तरीय कैशिंग रणनीति लागू करता है जो नेटवर्क अनुरोधों को कम करता है और इमेज प्रदर्शन को गति देता है। प्रत्येक स्तर का अपना उद्देश्य और डेटा जीवनकाल होता है।

स्तरभंडारण प्रकारजीवनकालडिफ़ॉल्ट आकार
Memory CacheRAM में BitmapLRU निष्कासन तकheap का 25%, 32 MB से
Disk CacheJPEG/WebP फ़ाइलेंसीमा पार होने तक250 MB
Http CacheOkHttp प्रतिक्रियाएँCache-Control हेडर के अनुसारHTTP क्लाइंट पर निर्भर करता है

Memory Cache पहले से डिकोड की गई Bitmaps तक तत्काल पहुँच प्रदान करता है। Disk Cache पहली लोडिंग के बाद बिना नेटवर्क (offline-first) के एप्लिकेशन के काम करने को सुनिश्चित करता है। OkHttp स्तर पर Http Cache ETag और If-Modified-Since के साथ सशर्त अनुरोधों को संभालता है।

कैशिंग नीतियाँ प्रति-अनुरोध CachePolicy के माध्यम से तीन मानों के साथ कॉन्फ़िगर की जाती हैं: ENABLED, READ_ONLY, WRITE_ONLY, DISABLED। उदाहरण के लिए, उपयोगकर्ता अवतारों के लिए, Memory Cache के लिए READ_ONLY और Disk Cache के लिए ENABLED सेट किया जा सकता है।

Kotlin में Coil उपयोग के उदाहरण

Coil एप्लिकेशन आर्किटेक्चर के आधार पर कई एकीकरण विधियाँ प्रदान करता है। आइए कार्यशील कोड उदाहरणों के साथ तीन मुख्य परिदृश्य देखें।

एक्सटेंशन के माध्यम से ImageView में लोड करना

load ImageView के लिए एक एक्सटेंशन फ़ंक्शन है, जो एक पंक्ति में इमेज लोड करने का सबसे सरल तरीका है। फ़ंक्शन URL, URI, Int संसाधन या File, साथ ही लैम्ब्डा कॉन्फ़िगरेटर के माध्यम से सभी वैकल्पिक पैरामीटर स्वीकार करता है।

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

load विधि एक Disposable लौटाती है, जिसे onDestroy में या View के पुन: उपयोग पर रद्द किया जा सकता है। यह तेज़ सूची स्क्रॉलिंग के दौरान मेमोरी लीक और अनावश्यक नेटवर्क अनुरोधों को रोकता है।

Jetpack Compose में उपयोग

AsyncImage घोषणात्मक UI में इमेज लोड करने के लिए एक composable फ़ंक्शन है। यह किसी भी डेटा स्रोत और स्थितियों के लिए तीन वैकल्पिक पैरामीटर स्वीकार करता है: placeholder, error और success।

kotlin
@Composable
fun NetworkImage(url: String) {
    AsyncImage(
        model = url,
        contentDescription = "नेटवर्क इमेज",
        placeholder = ColorPainter(Color.Gray),
        error = ColorPainter(Color.Red)
    )
}

SubcomposeAsyncImage एक अधिक लचीला संस्करण है जो कंटेंट स्लॉट के माध्यम से लोडिंग के दौरान डिस्प्ले को अनुकूलित करने की अनुमति देता है। यह कंकाल (shimmer) और प्रगति बार के लिए उपयोगी है।

गैर-मानक आउटपुट के लिए कस्टम Target

यदि ImageView या AsyncImage उपयुक्त नहीं हैं, तो आप एक Target लागू कर सकते हैं जिसमें एक एकल onSuccess विधि होती है जो Bitmap स्वीकार करती है। इसका उपयोग Notification, RemoteViews या OpenGL टेक्सचर में लोड करने के लिए किया जाता है।

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 की तुलना

इमेज लोडिंग लाइब्रेरी का चुनाव प्रोजेक्ट आवश्यकताओं पर निर्भर करता है। Coil Glide और Picasso के साथ प्रतिस्पर्धा करता है, प्रत्येक की अपनी ताकत है। मुख्य विशेषताओं की तुलना तालिका में प्रस्तुत की गई है।

विशेषताCoilGlidePicasso
भाषाKotlin (100%)Java + KotlinJava
APK आकार~150 KB~500 KB~120 KB
Coroutinesअंतर्निहितनहीं (कॉलबैक)नहीं (कॉलबैक)
Jetpack Composeमूल समर्थनaccompanist के माध्यम सेतृतीय-पक्ष
GIF/WebPहाँ (अंतर्निहित)हाँ (अंतर्निहित)नहीं
Google अनुशंसाहाँ (I/O 2023)हाँनहीं

Kotlin और Jetpack Compose पर नए प्रोजेक्ट्स के लिए, Coil शून्य अतिरिक्त coroutine निर्भरताओं और न्यूनतम आकार के कारण स्वाभाविक विकल्प बन जाता है। Glide एनिमेशन और वीडियो पूर्वावलोकन वाले जटिल परिदृश्यों के लिए पसंदीदा बना हुआ है। Picasso कार्यक्षमता में दोनों से पीछे है लेकिन सरलता में जीतता है।

Android प्रोजेक्ट में Coil सेट करना

Android प्रोजेक्ट में Coil जोड़ना Gradle निर्भरता के माध्यम से किया जाता है। जोड़ने के बाद, लाइब्रेरी ContentProvider के माध्यम से स्वचालित रूप से एक ImageLoader पंजीकृत करती है, इसलिए Application में मैन्युअल आरंभीकरण की आवश्यकता नहीं है। यदि अनुकूलन की आवश्यकता है, तो बिल्डर के माध्यम से एक कस्टम ImageLoader बनाया जाता है।

kotlin
// build.gradle.kts (app module)
dependencies {
    implementation("io.coil-kt:coil:2.6.0")
    // Jetpack Compose के लिए अतिरिक्त:
    implementation("io.coil-kt:coil-compose:2.6.0")
    // SVG समर्थन के लिए:
    implementation("io.coil-kt:coil-svg:2.6.0")
    // GIF समर्थन के लिए:
    implementation("io.coil-kt:coil-gif:2.6.0")
}

ImageLoader को अनुकूलित करने के लिए, ImageLoaderFactory का उपयोग किया जाता है — Application.onCreate में बनाया गया एक सिंगलटन। फ़ैक्टरी में, आप कैश सीमाएँ, HTTP क्लाइंट, कस्टम डिकोडर और लॉगिंग कॉन्फ़िगर कर सकते हैं। डिफ़ॉल्ट रूप से, Coil एक तैयार कनेक्शन पूल के साथ OkHttp का उपयोग करता है।

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()
    }
}

अक्सर पूछे जाने वाले प्रश्न

Coil क्या है और इसका उपयोग किसके लिए किया जाता है?

Coil Android पर इमेज लोड करने के लिए एक लाइब्रेरी है, जो Kotlin में coroutines का उपयोग करके लिखी गई है। इसका उपयोग नेटवर्क, संसाधनों या फ़ाइल सिस्टम से एसिंक्रोनस लोडिंग, कैशिंग और बिटमैप इमेज प्रदर्शित करने के लिए किया जाता है।

Coil Glide से कैसे अलग है?

Coil 100% Kotlin में लिखा गया है और Glide में कॉलबैक तंत्र के बजाय coroutines का उपयोग करता है। Coil का APK आकार छोटा (~150 KB बनाम ~500 KB) और AsyncImage के माध्यम से Jetpack Compose के लिए मूल समर्थन है।

Kotlin प्रोजेक्ट में Coil कैसे जोड़ें?

build.gradle.kts में निर्भरता io.coil-kt:coil:2.6.0 जोड़ें। Jetpack Compose के लिए, io.coil-kt:coil-compose:2.6.0 भी जोड़ें। लाइब्रेरी ContentProvider के माध्यम से स्वचालित रूप से ImageLoader पंजीकृत करती है।

Coil किस प्रकार की इमेज का समर्थन करता है?

Coil JPEG, PNG, WebP, BMP, SVG (coil-svg मॉड्यूल के माध्यम से) और GIF (coil-gif मॉड्यूल के माध्यम से) का समर्थन करता है। AVIF और HEIF प्रारूप Android 10+ वाले उपकरणों पर कस्टम डिकोडर के माध्यम से समर्थित हैं।

Coil में कैश कैसे कॉन्फ़िगर करें?

कैश ImageLoader.Builder के माध्यम से कॉन्फ़िगर किया जाता है: memoryCache heap के प्रतिशत के साथ, diskCache पथ और बाइट्स में सीमा के साथ। कैश नीतियाँ (ENABLED, DISABLED, READ_ONLY) CachePolicy के माध्यम से प्रति-अनुरोध कॉन्फ़िगर की जाती हैं।

सारांश

  • Coil Kotlin के लिए एक इमेज लोडिंग लाइब्रेरी है जिसमें पूर्ण coroutine और Jetpack Compose समर्थन है।
  • ImageLoader अनुरोधों, कैशिंग और ट्रांसफ़ॉर्मेशन का प्रबंधन करता है, दो कैश स्तरों का उपयोग करते हुए: Memory Cache और Disk Cache।
  • AsyncImage और SubcomposeAsyncImage Compose एकीकरण प्रदान करते हैं, placeholder, error और success स्थितियों का समर्थन करते हुए।
  • APK आकार ~150 KB Coil को बाजार में सबसे कॉम्पैक्ट इमेज लोडिंग लाइब्रेरीज़ में से एक बनाता है।
  • ट्रांसफ़ॉर्मेशन (RoundedCorners, CircleCrop, Blur) लाइब्रेरी में निर्मित हैं और हार्डवेयर त्वरण के साथ काम करते हैं।
  • Disk Cache कॉन्फ़िगर करने योग्य भंडारण सीमा के साथ पहले लोड की गई इमेज तक ऑफलाइन पहुँच प्रदान करता है।
  • Google द्वारा Coil की अनुशंसा आधिकारिक Jetpack Compose गाइड में की गई है, जो आधुनिक मानक के रूप में इसकी स्थिति की पुष्टि करती है।

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें