Android Academy · पाठ

पेजिंग क्यों

हर चीज़ को एक साथ लोड करने की लागत।

पाठ 1, कुल 4 में से13 चरण

पेजिंग क्यों, CoddyKit पर Android Academy का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Android Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Android Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

सब कुछ लोड करना महँगा है

50,000 आइटम वाली फ़ीड की कल्पना करें। यदि आप उन्हें एक साथ प्राप्त करके मेमोरी में रखते हैं, तो मेमोरी व्यर्थ होती है, नेटवर्क धीमा पड़ता है और प्रतिक्रिया को पार्स किए जाने के दौरान UI रुक जाता है।

अधिकांश उपयोगकर्ता केवल शुरुआती कुछ स्क्रीन तक ही स्क्रॉल करते हैं। Paging का अर्थ है उपयोगकर्ता के स्क्रॉल करने पर डेटा को छोटे भागों (पेजों) में लोड करना, न कि शुरुआत में ही पूरा डेटा लोड कर लेना।

कोड में समस्या

एक सरल तरीका पूरी सूची को मेमोरी में लोड करता है। सर्वर इसका समर्थन करता हो, तब भी प्रतिक्रिया बहुत बड़ी हो सकती है और पार्स की गई सूची हीप पर बहुत अधिक जगह ले सकती है।

यह तरीका बड़े डेटा-सेट के लिए प्रभावी नहीं है और OutOfMemoryError का जोखिम पैदा करता है।

// Anti-pattern: load the whole table at once
suspend fun loadAllArticles(): List<Article> {
    // Could be tens of thousands of rows / megabytes of JSON
    return api.getArticles(limit = 50_000)
}

// UI holds ALL of them in memory at once
val articles = loadAllArticles()
LazyColumn {
    items(articles) { article -> ArticleRow(article) }
}

एक पेज कैसा दिखता है

पेज डेटा-सेट का एक छोटा हिस्सा होता है, जिसमें अक्सर 20–50 आइटम होते हैं। सर्वर एक पेज के साथ अगले पेज का संकेतक भी लौटाता है—यह संख्या, ऑफ़सेट या टोकन हो सकता है।

ऐप मेमोरी में केवल कुछ पेज रखता है और उपयोगकर्ता के आगे स्क्रॉल करने पर पुराने पेज हटा देता है।

data class ArticlePage(
    val items: List<Article>,
    val nextKey: Int?   // null means no more pages
)

// Example REST call returning one page
suspend fun getArticlePage(page: Int, size: Int = 20): ArticlePage

Paging 3 से परिचय

Paging 3 Jetpack लाइब्रेरी है, जो पेजिंग के सभी जटिल हिस्सों को आपके लिए संभालती है:

  • उपयोगकर्ता के सूची के अंत के पास पहुँचने पर अगला पेज माँगना
  • मेमोरी में केवल आइटम की एक सीमित विंडो रखना
  • लोडिंग और त्रुटि की स्थितियाँ उपलब्ध कराना
  • कॉरूटीन, Flow और Jetpack Compose के लिए अंतर्निहित समर्थन

निर्भरता जोड़ना

Paging 3 अलग-अलग आर्टिफैक्ट के रूप में उपलब्ध है: एक रनटाइम और एक Compose इंटीग्रेशन। इन्हें अपने मॉड्यूल की build.gradle.kts फ़ाइल में जोड़ें।

paging-compose आर्टिफैक्ट आपको LazyColumn के लिए सहायक सुविधाएँ देता है।

// build.gradle.kts (module)
dependencies {
    val pagingVersion = "3.3.6"
    implementation("androidx.paging:paging-runtime:$pagingVersion")
    implementation("androidx.paging:paging-compose:$pagingVersion")
}

तीन मुख्य हिस्से

Paging 3 तीन प्रकारों के इर्द-गिर्द बना है, जिनका आप बार-बार उपयोग करेंगे:

  • PagingSource - किसी स्रोत से एक पेज लोड करने का तरीका जानता है
  • पेजर - पेज किए गए डेटा की स्ट्रीम को कॉन्फ़िगर और तैयार करता है
  • PagingData - आइटम का कंटेनर, जिसे Flow के रूप में भेजा जाता है

अगले पाठों में हम इनमें से प्रत्येक को बनाएँगे।

PagingData और Flow

आपका रिपॉज़िटरी Flow<PagingData<T>> उपलब्ध कराता है। UI इसे कलेक्ट करता है और उस समय लोड किए गए आइटम दिखाता है।

आपको पूरी सूची स्वयं कभी तैयार नहीं करनी पड़ती—Paging आवश्यकतानुसार आइटम UI में भेजता रहता है।

import androidx.paging.Pager
import androidx.paging.PagingConfig
import androidx.paging.PagingData
import kotlinx.coroutines.flow.Flow

class ArticleRepository(private val api: ArticleApi) {
    fun articles(): Flow<PagingData<Article>> = Pager(
        config = PagingConfig(pageSize = 20)
    ) {
        ArticlePagingSource(api)
    }.flow
}

PagingConfig विंडो को नियंत्रित करता है

PagingConfig यह निर्धारित करता है कि Paging डेटा को कैसे लोड और संभालेगा:

  • pageSize - प्रत्येक पेज अनुरोध में आइटम की संख्या
  • prefetchDistance - अगला लोड शुरू करने के लिए किनारे से कितनी दूरी होनी चाहिए
  • enablePlaceholders - अभी तक लोड न हुए आइटम के लिए प्लेसहोल्डर स्लॉट दिखाना
  • maxSize - मेमोरी में रखे जाने वाले आइटम की अधिकतम संख्या
import androidx.paging.PagingConfig

val config = PagingConfig(
    pageSize = 20,
    prefetchDistance = 5,
    enablePlaceholders = false,
    maxSize = 100
)

नेटवर्क या डेटाबेस—या दोनों

एक PagingSource REST API, Room डेटाबेस या किसी भी कस्टम स्रोत से डेटा ले सकता है।

वास्तविक ऑफ़लाइन-प्रथम अनुभव के लिए आप दोनों को RemoteMediator के साथ जोड़ते हैं (जिसके बारे में अंतिम पाठ में बताया गया है): नेटवर्क स्थानीय डेटाबेस में डेटा भरता है और UI उसी डेटाबेस से पेज लोड करता है।

सुचारु स्क्रॉलिंग, कम मेमोरी

पेजिंग के साथ स्क्रॉलिंग सुचारु रहती है, क्योंकि प्रत्येक अनुरोध छोटा होता है और मेमोरी की विंडो maxSize से सीमित रहती है।

लोडिंग और त्रुटि संकेतक LoadState के माध्यम से अपने-आप मिल जाते हैं, इसलिए आप बिना स्वयं स्थिति सँभाले नीचे स्पिनर या पुनः प्रयास बटन दिखा सकते हैं।

// LoadState exposes loading/error per direction
when (val state = adapterLoadState.append) {
    is LoadState.Loading -> showBottomSpinner()
    is LoadState.Error -> showRetry(state.error)
    is LoadState.NotLoading -> hideBottomSpinner()
}

पेजिंग की आवश्यकता कब होती है

इन स्थितियों में Paging 3 का उपयोग करें:

  • डेटा-सेट बड़ा या असीमित हो (फ़ीड, खोज परिणाम, चैट इतिहास)
  • डेटा ऐसे नेटवर्क API से आता हो जो पेज या कर्सर लौटाता है
  • आप स्वचालित लोडिंग/त्रुटि UI और मेमोरी नियंत्रण चाहते हों

छोटी, निश्चित सूची (जैसे सेटिंग मेनू) के लिए सामान्य LazyColumn अधिक सरल और पूरी तरह पर्याप्त है।

त्वरित जाँच

बड़ी सूची के लिए Paging 3 का उपयोग करने का मुख्य लाभ क्या है?

पुनरावृत्ति: पेजिंग क्यों

आपने सीखा कि एक साथ सब कुछ लोड करने से प्रदर्शन और मेमोरी पर बुरा प्रभाव क्यों पड़ता है, और Paging 3 इसे कैसे हल करता है।

  • उपयोगकर्ता के स्क्रॉल करने पर डेटा छोटे पेज में लोड होता है
  • तीन मुख्य हिस्से हैं PagingSource, Pager और PagingData
  • PagingConfig पेज का आकार, प्रीफ़ेच और मेमोरी विंडो निर्धारित करता है
  • Paging कॉरूटीन, Flow और Compose के साथ इंटीग्रेट होता है तथा लोडिंग/त्रुटि की स्थितियाँ अपने-आप उपलब्ध कराता है

अगला चरण: PagingSource बनाना और उसे Pager से जोड़ना।

शुरुआत निःशुल्क

एआई शिक्षक के साथ Kotlin सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
36
पाठ
152

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

क्या “पेजिंग क्यों” पाठ निःशुल्क है?

हाँ — Android Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “पेजिंग क्यों” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Android Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“पेजिंग क्यों” में मैं क्या सीखूँगा?

हर चीज़ को एक साथ लोड करने की लागत। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Android Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Android Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Android Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।

“पेजिंग क्यों” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Android Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Android Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. पेजिंग क्यों
  2. PagingSource और Pager
  3. Compose सूचियों में पेजिंग
  4. RemoteMediator और कैशिंग
← Android Academy पर वापस जाएँ