Lazy Loading डेटा, इमेज और घटकों की विलंबित लोडिंग की एक रणनीति है, जिसमें संसाधनों का अनुरोध ऐप शुरू होने पर नहीं, बल्कि उस समय किया जाता है जब उपयोगकर्ता को वास्तव में उनकी आवश्यकता होती है। Android Paging 3 गाइड के अनुसार, सूचियों की विलंबित लोडिंग बड़े डेटासेट के साथ काम करते समय मेमोरी खपत को 60–80% तक कम कर देती है। विलंबित आरंभीकरण मूल सिद्धांत है जो सभी Lazy Loading कार्यान्वयनों के आधार पर है।
मुख्य बातें
Lazy Loading (विलंबित लोडिंग) एक डिज़ाइन और अनुकूलन पैटर्न है जिसमें ऐप संसाधन स्टार्टअप पर नहीं, बल्कि उपयोग से तुरंत पहले लोड किए जाते हैं। मोबाइल डेवलपमेंट में, Lazy Loading तीन मुख्य श्रेणियों पर लागू होता है: डेटा (सूची पृष्ठांकन), इमेज (स्क्रॉल पर लोडिंग), और घटक (विलंबित स्टैक और व्यू)।
Lazy Loading के विपरीत Eager Loading (तत्पर लोडिंग) है, जहाँ सभी संसाधन स्क्रीन स्टार्टअप पर लोड किए जाते हैं। Eager Loading लागू करना सरल है लेकिन अधिक मेमोरी खपत करता है और पहली बार प्रदर्शित होने का समय बढ़ाता है। हज़ारों आइटम वाली सूचियों के लिए, Eager Loading सीमित मेमोरी वाले उपकरणों पर OOM (मेमोरी खत्म) की ओर ले जाता है। Lazy Loading केवल वही लोड करके इस समस्या को हल करता है जो स्क्रीन पर दिखाई देता है और बाकी को स्क्रॉल करने पर लोड करता है।
iOS और Android के संदर्भ में, Lazy Loading विभिन्न स्तरों पर कार्यान्वित किया जाता है। SwiftUI विलंबित रेंडरिंग के लिए LazyVStack और LazyHStack प्रदान करता है। UIKit dequeueReusableCell के साथ UITableView का उपयोग करता है। Android ViewHolder पूल के साथ RecyclerView का उपयोग करता है। डेटा स्तर पर, Paging 3 के साथ Room और NSFetchedResultsController के साथ Core Data। विशिष्ट तकनीक का चुनाव स्टैक और प्रदर्शन आवश्यकताओं पर निर्भर करता है।
केंद्रीय सिद्धांत Lazy Loading का है कि स्क्रीन की वर्तमान स्थिति के लिए आवश्यक डेटा की सटीक मात्रा लोड की जाए, साथ ही सुचारू स्क्रॉलिंग के लिए एक पूर्वानुमानित बफ़र। यह दृष्टिकोण दो तंत्रों पर आधारित है: दृश्यता ट्रैकिंग और तत्व आभासीकरण।
ट्रैकिंग तंत्र यह निर्धारित करता है कि कौन से तत्व स्क्रीन के दृश्य क्षेत्र (viewport) में हैं। Android पर, यह LinearLayoutManager या GridLayoutManager findFirstVisibleItemPosition और findLastVisibleItemPosition विधियों के माध्यम से करता है। iOS में, UIScrollView दृश्य क्षेत्र की गणना के लिए bounds.origin.y और contentOffset.height प्रदान करता है। जब कोई तत्व viewport (या प्रीफ़ेच बफ़र) में प्रवेश करता है, तो उसकी लोडिंग शुरू हो जाती है। जब कोई तत्व स्क्रीन छोड़ता है, तो उसके संसाधनों को मुक्त किया जा सकता है या कैश में ले जाया जा सकता है।
// Android — RecyclerView में दृश्यता ट्रैकिंग
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
val layoutManager = recyclerView.layoutManager as LinearLayoutManager
val lastVisible = layoutManager.findLastVisibleItemPosition()
val totalCount = layoutManager.itemCount
// अगला पृष्ठ लोड कर रहे हैं यदि शेष हैं < 5 तत्व
if (lastVisible >= totalCount - 5) {
loadMoreItems()
}
}
})
प्रीफ़ेच बफ़र उन तत्वों की पूर्वानुमानित लोडिंग है जो जल्द ही स्क्रीन पर दिखाई देंगे। RecyclerView layoutManager.setItemPrefetchEnabled(true) के माध्यम से GapWorker.Prefetch का समर्थन करता है। iOS UITableView UITableViewDataSourcePrefetching के माध्यम से प्रीफ़ेचिंग का समर्थन करता है। प्रीफ़ेच बफ़र का आकार आमतौर पर 1–2 स्क्रीन आगे होता है, जो स्क्रॉल स्मूथनेस और मेमोरी खपत के बीच समझौता प्रदान करता है। बहुत बड़ा प्रीफ़ेच बफ़र Lazy Loading के लाभों को नकार देता है; बहुत छोटा बफ़र तेज़ स्क्रॉलिंग के दौरान खाली स्थान बनाता है।
इमेज मोबाइल ऐप्लिकेशन में सबसे भारी प्रकार के संसाधन हैं। एक 12 MP फ़ोटो असम्पीडित रूप में 3–5 MB ले सकती है। इमेज की Lazy Loading सैकड़ों अदृश्य चित्रों को मेमोरी में लोड होने से रोकती है, जो उपयोगकर्ता अवतार या उत्पाद सूची वाली सूचियों के लिए घातक होगा।
Glide Android के लिए सबसे लोकप्रिय इमेज लोडिंग लाइब्रेरी है जो कैशिंग, ट्रांसफ़ॉर्मेशन और एनिमेशन का समर्थन करती है। Coil एक हल्का विकल्प है, जो कोरूटीन का उपयोग करके Kotlin में लिखा गया है। दोनों लाइब्रेरी जब ImageView स्क्रीन छोड़ता है तो स्वचालित रूप से लोडिंग रोक देती हैं और ViewHolder के पुन: उपयोग पर अनुरोध रद्द कर देती हैं। Coil कोरूटीन का उपयोग करता है और इसका आकार ~1.5 MB बनाम Glide का ~4 MB है, जो इसे APK आकार पर ध्यान केंद्रित करने वाली परियोजनाओं के लिए प्राथमिकता देता है।
// Coil — विलंबित इमेज लोडिंग
imageView.load("https://example.com/image.jpg") {
crossfade(true)
placeholder(R.drawable.placeholder)
size(512, 512)
memoryCachePolicy(CachePolicy.ENABLED)
}
Kingfisher iOS के लिए Swift Concurrency, डिस्क और मेमोरी कैशिंग, और UICollectionView के लिए प्रीफ़ेचिंग के समर्थन वाली लाइब्रेरी है। SDWebImage Objective-C जड़ों वाली पुरानी लाइब्रेरी है लेकिन Swift समर्थन के साथ। दोनों लाइब्रेरी UIImageView के साथ एकीकृत होती हैं और स्वचालित रूप से लोडिंग जीवनचक्र प्रबंधित करती हैं: सेल के पुन: उपयोग पर अनुरोध रद्द करती हैं, इमेज केवल तब लोड करती हैं जब सेल दिखाई दे रही हो, और मेमोरी कम होने की सूचना पर मेमोरी मुक्त करती हैं।
बड़ी सूचियाँ मोबाइल ऐप्स में Lazy Loading के मुख्य अनुप्रयोग क्षेत्र हैं। समाचार फ़ीड, उत्पाद सूची, चैट, लेन-देन इतिहास — कोई भी स्क्रीन जिसमें संभावित रूप से अनंत सूची है, उसे पृष्ठांकन और विलंबित लोडिंग की आवश्यकता होती है।
Paging 3 Android Jetpack की एक लाइब्रेरी है जो पूर्ण विलंबित लोडिंग चक्र को लागू करती है: RemoteMediator (API + डेटाबेस) से डेटा अनुरोध, Room में कैशिंग, PagingData के माध्यम से पृष्ठ-दर-पृष्ठ आउटपुट, और AsyncPagingDataAdapter के माध्यम से प्रदर्शन। Paging 3 तीन प्रकार के पृष्ठांकन का समर्थन करता है: पृष्ठ-आधारित, आइटम-आधारित (offset/limit), और कुंजी-आधारित (API से पृष्ठांकन कुंजियाँ)। Separator लोडिंग संकेतकों के लिए पृष्ठों के बीच विभाजकों का अंतर्निहित समर्थन है।
// Paging 3 — API से विलंबित लोडिंग
class ArticlePagingSource(
private val api: ArticleApi
) : PagingSource<Int, Article>() {
override suspend fun load(
params: LoadParams<Int>
): LoadResult<Int, Article> {
return try {
val page = params.key ?: 1
val response = api.getArticles(page)
LoadResult.Page(
data = response.items,
prevKey = page.takeIf { it > 1 }?.dec(),
nextKey = page + 1
)
} catch (e: Exception) {
LoadResult.Error(e)
}
}
}
LazyVStack SwiftUI का एक अंतर्निहित कंटेनर है जो तत्वों को केवल स्क्रीन पर दिखाई देने पर बनाता और रेंडर करता है। VStack के विपरीत, जो तुरंत सभी चाइल्ड तत्वों का लेआउट गणना करता है, LazyVStack तत्व के दृश्यमान होने या प्रीफ़ेच रेंज में प्रवेश करने तक व्यू निर्माण को स्थगित करता है। LazyHStack कैरोसेल के लिए क्षैतिज समकक्ष है। बड़ी सूचियों के लिए, Apple List का उपयोग करने की अनुशंसा करता है, जो आंतरिक रूप से LazyVStack के समान काम करता है जिसमें अतिरिक्त अंतर्निहित रीसाइक्लिंग होती है।
// SwiftUI — विलंबित लोडिंग के साथ LazyVStack
ScrollView {
LazyVStack(spacing: 8) {
ForEach(articles) { article in
ArticleRow(article: article)
.onAppear {
if article == articles.last {
viewModel.loadMore()
}
}
}
}
}
UI घटकों की विलंबित लोडिंग एक तकनीक है जहाँ इंटरफ़ेस के कुछ भाग (हेडर, फ़ुटर, सेटिंग्स अनुभाग, टैब) स्क्रीन स्टार्टअप पर नहीं, बल्कि पहली बार एक्सेस करने पर बनाए जाते हैं। यह प्रारंभिक रेंडर को तेज़ करता है और मुख्य थ्रेड पर लोड कम करता है।
ViewStub Android में एक हल्का View प्लेसहोल्डर है जो लेआउट में स्थान नहीं लेता है और inflate() कॉल होने तक चाइल्ड View नहीं बनाता है। यह शायद ही कभी उपयोग किए जाने वाले अनुभागों के लिए आदर्श है: खोज पैनल, उन्नत सेटिंग्स, विज्ञापन ब्लॉक। Fragment विलंबित लोडिंग एक तकनीक है जहाँ Fragment.onCreateView तब तक स्थगित किया जाता है जब तक उपयोगकर्ता उस टैब पर स्विच नहीं करता। इसे ViewPager में isVisible या UserVisibleHint के माध्यम से कार्यान्वित किया जाता है।
AndroidX माँग पर मॉड्यूल की विलंबित लोडिंग के लिए SplitInstallManager प्रदान करता है। सेटअप, डायग्नोस्टिक्स या अतिरिक्त सुविधा मॉड्यूल उपयोगकर्ता के पहले अनुरोध पर ही Dynamic Feature मॉड्यूल के रूप में लोड किए जाते हैं। यह आधार ऐप आकार को 30–50% तक कम करता है और साथ ही सिद्धांत को लागू करता है Lazy Loading का न केवल डेटा स्तर पर बल्कि कोड स्तर पर भी।
TabView SwiftUI में प्रत्येक टैब की सामग्री को विलंबित रूप से लोड करता है — केवल टैब सक्रिय होने पर। UIKit UITabBarController डिफ़ॉल्ट रूप से स्टार्टअप पर सभी चाइल्ड कंट्रोलर बनाता है, लेकिन इस व्यवहार को उन्हें तुरंत tabBarController.viewControllers में जोड़े बिना और उपयोगकर्ता के स्विच करने पर उन्हें प्रतिस्थापित करके बदला जा सकता है। UIStackView गतिशील रूप से जोड़े गए arrangedSubviews के साथ भी Lazy Loading सिद्धांत का पालन करता है — Subview केवल तब जोड़ें जब उपयोगकर्ता कोई कार्रवाई करे जिसके लिए इंटरफ़ेस के उस भाग की आवश्यकता हो।
समग्र स्क्रीन लोडिंग को अनुकूलित करने के लिए, सभी स्तरों पर Lazy Loading को संयोजित करें: शायद ही कभी उपयोग किए जाने वाले अनुभागों के लिए ViewStub, डेटा के लिए Paging 3, इमेज के लिए Glide/Coil, और Hilt/Dagger Scopes या Swinject के माध्यम से विलंबित ViewModel आरंभीकरण। यह दृष्टिकोण एक ऐसी स्क्रीन उत्पन्न करता है जो 3 GB RAM वाले बजट उपकरणों पर भी 200–400 ms में लोड होती है।
अक्सर पूछे जाने वाले प्रश्न
यदि स्क्रीन गारंटीकृत रूप से कम आइटम (20 तक) दिखाती है और सभी की तुरंत आवश्यकता है, तो Lazy Loading अनावश्यक है। उन सूचियों के लिए जिन्हें शायद ही कभी स्क्रॉल किया जाता है, Eager Loading बिना ध्यान देने योग्य प्रदर्शन हानि के लागू करने में सरल और तेज़ हो सकता है।
यह बड़ी सूचियों के लिए अधिकतम मेमोरी खपत को 3–10 गुना कम करता है, क्योंकि मेमोरी में केवल दृश्य तत्व और प्रीफ़ेच बफ़र संग्रहीत होते हैं। हालाँकि, प्रीफ़ेच और इमेज कैशिंग जोड़ने से मध्यम मेमोरी खपत होती है जिसे प्रबंधित करने की आवश्यकता होती है।
List स्वाइप, ड्रैग-एंड-ड्रॉप और अंतर्निहित चयन समर्थन वाले समरूप डेटा के लिए बेहतर है। LazyVStack विभिन्न सेल प्रकारों, अनुभागों और गैर-मानक स्पेसिंग वाले कस्टम लेआउट के लिए है। List आंतरिक रूप से अतिरिक्त कार्यक्षमता के साथ LazyVStack की तरह काम करता है।
Android पर, View पदानुक्रम देखने के लिए Layout Inspector का उपयोग करें: Lazy Loading के साथ, अधिकांश तत्व ट्री से अनुपस्थित होने चाहिए। iOS पर, Xcode Debug View Hierarchy का उपयोग करें। यदि स्क्रॉलिंग के दौरान सभी तत्व मौजूद हैं, तो Lazy Loading काम नहीं कर रहा है।
दोनों पैरामीटर महत्वपूर्ण हैं, लेकिन प्राथमिकता प्लेटफ़ॉर्म पर निर्भर करती है। iOS पर ARC और कुशल मेमोरी प्रबंधन के साथ, प्राथमिकता लोडिंग गति है। Android पर JVM और GC के साथ, प्राथमिकता मेमोरी बचत है, क्योंकि मुख्य थ्रेड पर प्रत्येक आवंटन GC फ़्रीज़ का कारण बन सकता है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें