סקירה כללית של ספריית Paging   בארגז הכלים Android Jetpack.

ספריית Paging עוזרת לכם לטעון ולהציג דפים של נתונים ממערך נתונים גדול יותר מאחסון מקומי או מרשת. הגישה הזו מאפשרת לאפליקציה להשתמש ברוחב הפס של הרשת ובמשאבי המערכת בצורה יעילה יותר. הרכיבים של ספריית Paging מתוכננים להתאים לארכיטקטורת האפליקציות המומלצת ל-Android, להשתלב בצורה חלקה עם רכיבי Jetpack אחרים ולספק תמיכה מעולה ב-Kotlin.

יתרונות השימוש בספריית Paging

ספריית ה-Paging כוללת את התכונות הבאות:

  • שמירת נתונים בדפים במטמון בזיכרון. כך אפשר לוודא שהאפליקציה משתמשת במשאבי המערכת בצורה יעילה בזמן העבודה עם נתונים שמוצגים בדפים.
  • ביטול כפילויות מובנה בבקשות, כדי לוודא שהאפליקציה משתמשת ברוחב פס ברשת ובמשאבי מערכת בצורה יעילה.
  • תמיכה מלאה בשגרות המשך (coroutine) וב-Flows של Kotlin.
  • תמיכה מובנית בטיפול בשגיאות, כולל יכולות רענון וניסיון חוזר.

הגדרה

כדי לייבא רכיבי Paging לאפליקציית Android, מוסיפים את התלויות הבאות לקובץ build.gradle של האפליקציה:

Kotlin

dependencies {
  val paging_version = "3.4.2"

  implementation("androidx.paging:paging-common:$paging_version")

  // Jetpack Compose integration
  implementation("androidx.paging:paging-compose:$paging_version")
}

מגניב

dependencies {
  def paging_version = "3.4.2"

  implementation "androidx.paging:paging-common:$paging_version"

  // Jetpack Compose integration
  implementation "androidx.paging:paging-compose:$paging_version"
}

ארכיטקטורת הספרייה

הרכיבים של ספריית Paging פועלים בשלוש שכבות של האפליקציה:

  • שכבת המאגר
  • שכבת ViewModel
  • שכבת ממשק המשתמש
תמונה שבה מוצגים זרימות נתונים עם החלפה של דפים מרכיבי PagingSource או RemoteMediator בשכבת המאגר לרכיב Pager בשכבת ViewModel.
    לאחר מכן, רכיב ה-Pager חושף Flow של PagingData לרכיבי הפריסה העצלנית בשכבת ממשק המשתמש.
איור 1. דוגמה לאופן שבו ספריית Paging משתלבת בארכיטקטורת האפליקציה.

בקטע הזה מתוארים הרכיבים של ספריית Paging שפועלים בכל שכבה, ומוסבר איך הם פועלים יחד כדי לטעון ולהציג נתונים עם החלפה בין דפים.

שכבת מאגר

הרכיב העיקרי של ספריית Paging בשכבת המאגר הוא PagingSource. כל אובייקט PagingSource מגדיר מקור נתונים ואת אופן האחזור של הנתונים מהמקור הזה. אובייקט PagingSource יכול לטעון נתונים מכל מקור יחיד, כולל מקורות ברשת ומסדי נתונים מקומיים.

רכיב נוסף בספריית Paging שאפשר להשתמש בו הוא RemoteMediator. אובייקט RemoteMediator מטפל בהחלפה בין דפים ממקור נתונים בשכבות, כמו מקור נתונים ברשת עם מטמון של מסד נתונים מקומי.

שכבת ViewModel

הרכיב Pager מספק API ציבורי ליצירת מופעים של PagingData שנחשפים בזרמים ריאקטיביים, על סמך אובייקט PagingSource ואובייקט הגדרה PagingConfig.

הרכיב שמחבר את השכבה ViewModel לממשק המשתמש הוא PagingData. אובייקט PagingData הוא מאגר של תמונת מצב של נתונים עם מספור דפים. היא שולחת שאילתה לאובייקט PagingSource ומאחסנת את התוצאה.

שכבת ממשק המשתמש

ה-API הראשי של ממשק המשתמש של Paging הוא collectAsLazyPagingItems(). היא חושפת פריטים עם חלוקה לדפים כרשימת נתונים שרכיבי הפריסה העצלנית של Compose יכולים לעבד בקלות, כמו LazyColumn ו-LazyRow.

מוסיפים את ספריית androidx.paging:paging-compose כדי להשתמש בממשקי API שתואמים ל-Compose ומאפשרים לממשק המשתמש להגיב אוטומטית לטעינות נתונים, לעדכונים ולשגיאות בלי להשתמש במתאמים או בלוגיקה של השוואה. משתמשים בפונקציית ההרחבה collectAsLazyPagingItems() ב-Flow<PagingData> כדי להעביר את הערך המוחזר LazyPagingItems אל items() ב-LazyColumn.

@Composable
fun MessageList(pager: Pager<Int, Message>) {
    val lazyPagingItems = pager.flow.collectAsLazyPagingItems()

    LazyColumn {
        items(
            lazyPagingItems.itemCount,
            key = lazyPagingItems.itemKey { it.id }
        ) { index ->
            val message = lazyPagingItems[index]
            if (message != null) {
                MessageRow(message)
            } else {
                MessagePlaceholder()
            }
        }
    }
}

מידע נוסף זמין במאמר בנושא קבוצות גדולות של נתונים (החלפת דפים).