Coil Android पर इमेज लोड करने के लिए एक लाइब्रेरी है, जो Kotlin में लिखी गई है और coroutines पर आधारित है। आधिकारिक दस्तावेज़ीकरण के अनुसार, लाइब्रेरी Memory Cache, Disk Cache और हार्डवेयर-त्वरित ट्रांसफ़ॉर्मेशन का समर्थन करती है। Coil अपने न्यूनतम APK आकार (लगभग 150 KB) और Jetpack Compose के साथ पूर्ण संगतता के लिए जानी जाती है।
मुख्य बातें
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 ट्यूटोरियल में अनुशंसित किया गया है।
ImageLoader Coil का मुख्य घटक है, जो लोडिंग अनुरोधों को निष्पादित करने और कैश प्रबंधित करने के लिए जिम्मेदार है। प्रत्येक इंस्टेंस में MemoryCache, DiskCache, BitmapPool और coroutine पूल के संदर्भ होते हैं। डिफ़ॉल्ट रूप से, Coil.imageLoader(context) के माध्यम से बनाया गया एक सिंगलटन उपयोग किया जाता है।
ImageRequest एक ऑब्जेक्ट है जो एकल इमेज लोडिंग अनुरोध का वर्णन करता है: डेटा स्रोत (URL, URI, Int संसाधन), लक्ष्य ImageView या Target, ट्रांसफ़ॉर्मेशन, कैशिंग सेटिंग्स और placeholder। ImageRequest एक बिल्डर के माध्यम से बनाया जाता है, जो लचीलापन और पठनीयता सुनिश्चित करता है।
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 को भेजा जाता है।
Coil एक घटक आर्किटेक्चर पर बनाया गया है जिसमें डिपेंडेंसी इंजेक्शन के माध्यम से किसी भी भाग को बदलने की क्षमता है। सभी घटक ImageLoaderFactory में पंजीकृत होते हैं और बिल्डर के माध्यम से ImageLoader कंस्ट्रक्टर को भेजे जाते हैं।
ImageLoader सभी लोडिंग संचालन के लिए प्रवेश बिंदु है। प्रत्येक इंस्टेंस में coroutine पूल, BitmapPool, MemoryCache, DiskCache और इंटरसेप्टर्स की एक सूची होती है। डिफ़ॉल्ट रूप से, एक वैश्विक इंस्टेंस बनाया जाता है, लेकिन यूनिट परीक्षण के लिए, अलग-अलग कैश वाले अलग इंस्टेंस बनाए जा सकते हैं।
MemoryCache LRU (Least Recently Used) पर आधारित एक इन-मेमोरी कैश है जो डिकोड की गई Bitmap ऑब्जेक्ट्स को संग्रहीत करता है। डिफ़ॉल्ट अधिकतम आकार उपलब्ध एप्लिकेशन मेमोरी का 25% है, लेकिन 32 MB से कम नहीं। कैश कुंजी URL + आकार + ट्रांसफ़ॉर्मेशन से बनती है, जो पुरानी इमेज पुनर्प्राप्ति को रोकती है।
DiskCache कच्चे डेटा (JPEG, PNG, WebP) और डिकोड की गई मेटाडेटा के लिए एक फ़ाइल-आधारित कैश है। यह एप्लिकेशन की कैश निर्देशिका में स्थित होता है और सीमा पार होने पर स्वचालित सफाई का समर्थन करता है। डिस्क संचालन DiskCache.Builder के माध्यम से निर्देशिका और अधिकतम आकार कॉन्फ़िगरेशन के साथ किया जाता है।
Coil एक बहु-स्तरीय कैशिंग रणनीति लागू करता है जो नेटवर्क अनुरोधों को कम करता है और इमेज प्रदर्शन को गति देता है। प्रत्येक स्तर का अपना उद्देश्य और डेटा जीवनकाल होता है।
| स्तर | भंडारण प्रकार | जीवनकाल | डिफ़ॉल्ट आकार |
|---|---|---|---|
| Memory Cache | RAM में Bitmap | LRU निष्कासन तक | heap का 25%, 32 MB से |
| Disk Cache | JPEG/WebP फ़ाइलें | सीमा पार होने तक | 250 MB |
| Http Cache | OkHttp प्रतिक्रियाएँ | 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 सेट किया जा सकता है।
Coil एप्लिकेशन आर्किटेक्चर के आधार पर कई एकीकरण विधियाँ प्रदान करता है। आइए कार्यशील कोड उदाहरणों के साथ तीन मुख्य परिदृश्य देखें।
load ImageView के लिए एक एक्सटेंशन फ़ंक्शन है, जो एक पंक्ति में इमेज लोड करने का सबसे सरल तरीका है। फ़ंक्शन URL, URI, Int संसाधन या File, साथ ही लैम्ब्डा कॉन्फ़िगरेटर के माध्यम से सभी वैकल्पिक पैरामीटर स्वीकार करता है।
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 के पुन: उपयोग पर रद्द किया जा सकता है। यह तेज़ सूची स्क्रॉलिंग के दौरान मेमोरी लीक और अनावश्यक नेटवर्क अनुरोधों को रोकता है।
AsyncImage घोषणात्मक UI में इमेज लोड करने के लिए एक composable फ़ंक्शन है। यह किसी भी डेटा स्रोत और स्थितियों के लिए तीन वैकल्पिक पैरामीटर स्वीकार करता है: placeholder, error और success।
@Composable
fun NetworkImage(url: String) {
AsyncImage(
model = url,
contentDescription = "नेटवर्क इमेज",
placeholder = ColorPainter(Color.Gray),
error = ColorPainter(Color.Red)
)
}
SubcomposeAsyncImage एक अधिक लचीला संस्करण है जो कंटेंट स्लॉट के माध्यम से लोडिंग के दौरान डिस्प्ले को अनुकूलित करने की अनुमति देता है। यह कंकाल (shimmer) और प्रगति बार के लिए उपयोगी है।
यदि ImageView या AsyncImage उपयुक्त नहीं हैं, तो आप एक Target लागू कर सकते हैं जिसमें एक एकल onSuccess विधि होती है जो Bitmap स्वीकार करती है। इसका उपयोग Notification, RemoteViews या OpenGL टेक्सचर में लोड करने के लिए किया जाता है।
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 Glide और Picasso के साथ प्रतिस्पर्धा करता है, प्रत्येक की अपनी ताकत है। मुख्य विशेषताओं की तुलना तालिका में प्रस्तुत की गई है।
| विशेषता | Coil | Glide | Picasso |
|---|---|---|---|
| भाषा | Kotlin (100%) | Java + Kotlin | Java |
| 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 जोड़ना Gradle निर्भरता के माध्यम से किया जाता है। जोड़ने के बाद, लाइब्रेरी ContentProvider के माध्यम से स्वचालित रूप से एक ImageLoader पंजीकृत करती है, इसलिए Application में मैन्युअल आरंभीकरण की आवश्यकता नहीं है। यदि अनुकूलन की आवश्यकता है, तो बिल्डर के माध्यम से एक कस्टम ImageLoader बनाया जाता है।
// 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 का उपयोग करता है।
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 Android पर इमेज लोड करने के लिए एक लाइब्रेरी है, जो Kotlin में coroutines का उपयोग करके लिखी गई है। इसका उपयोग नेटवर्क, संसाधनों या फ़ाइल सिस्टम से एसिंक्रोनस लोडिंग, कैशिंग और बिटमैप इमेज प्रदर्शित करने के लिए किया जाता है।
Coil 100% Kotlin में लिखा गया है और Glide में कॉलबैक तंत्र के बजाय coroutines का उपयोग करता है। Coil का APK आकार छोटा (~150 KB बनाम ~500 KB) और AsyncImage के माध्यम से Jetpack Compose के लिए मूल समर्थन है।
build.gradle.kts में निर्भरता io.coil-kt:coil:2.6.0 जोड़ें। Jetpack Compose के लिए, io.coil-kt:coil-compose:2.6.0 भी जोड़ें। लाइब्रेरी ContentProvider के माध्यम से स्वचालित रूप से ImageLoader पंजीकृत करती है।
Coil JPEG, PNG, WebP, BMP, SVG (coil-svg मॉड्यूल के माध्यम से) और GIF (coil-gif मॉड्यूल के माध्यम से) का समर्थन करता है। AVIF और HEIF प्रारूप Android 10+ वाले उपकरणों पर कस्टम डिकोडर के माध्यम से समर्थित हैं।
कैश ImageLoader.Builder के माध्यम से कॉन्फ़िगर किया जाता है: memoryCache heap के प्रतिशत के साथ, diskCache पथ और बाइट्स में सीमा के साथ। कैश नीतियाँ (ENABLED, DISABLED, READ_ONLY) CachePolicy के माध्यम से प्रति-अनुरोध कॉन्फ़िगर की जाती हैं।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें