Übersicht über die Paging-Bibliothek   Teil von Android Jetpack

Mit der Paging-Bibliothek können Sie Seiten mit Daten aus einem größeren Datensatz aus dem lokalen Speicher oder über ein Netzwerk laden und anzeigen. So kann Ihre App sowohl die Netzwerkbandbreite als auch die Systemressourcen effizienter nutzen. Die Komponenten der Paging-Bibliothek sind so konzipiert, dass sie in die empfohlene Android-App-Architektur passen, sich nahtlos in andere Jetpack-Komponenten einfügen und erstklassige Kotlin-Unterstützung bieten.

Vorteile der Verwendung der Paging-Bibliothek

Die Paging-Bibliothek umfasst die folgenden Funktionen:

  • In-Memory-Caching für Ihre paginierten Daten. So wird sichergestellt, dass Ihre App Systemressourcen effizient nutzt, wenn sie mit paginierten Daten arbeitet.
  • Integrierte Deduplizierung von Anfragen, die dazu beiträgt, dass Ihre App Netzwerkbandbreite und Systemressourcen effizient nutzt.
  • Erstklassige Unterstützung für Kotlin-Coroutinen und -Flows.
  • Integrierte Unterstützung für die Fehlerbehandlung, einschließlich Aktualisierungs- und Wiederholungsfunktionen.

Einrichtung

Wenn Sie Paging-Komponenten in Ihre Android-App importieren möchten, fügen Sie der Datei build.gradle Ihrer App die folgenden Abhängigkeiten hinzu:

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

Groovy

dependencies {
  def paging_version = "3.4.2"

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

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

Bibliotheksarchitektur

Die Komponenten der Paging-Bibliothek sind in drei Ebenen Ihrer App tätig:

  • Repository-Ebene
  • Die Ebene ViewModel
  • UI-Ebene
Ein Bild, das zeigt, wie paginierte Daten aus den Komponenten „PagingSource“ oder „RemoteMediator“ in der Repository-Ebene in die Komponente „Pager“ in der ViewModel-Ebene fließen.
    Die Pager-Komponente stellt dann einen Flow von PagingData für die Lazy-Layout-Komponenten in der UI-Schicht bereit.
Abbildung 1. Ein Beispiel dafür, wie die Paging-Bibliothek in die Architektur Ihrer App passt.

In diesem Abschnitt werden die Komponenten der Paging-Bibliothek beschrieben, die auf jeder Ebene ausgeführt werden, und wie sie zusammenarbeiten, um seitenweise Daten zu laden und anzuzeigen.

Repository-Ebene

Die primäre Paging-Bibliothekskomponente in der Repository-Ebene ist PagingSource. Jedes PagingSource-Objekt definiert eine Datenquelle und gibt an, wie Daten aus dieser Quelle abgerufen werden. Mit einem PagingSource-Objekt können Daten aus einer beliebigen Quelle geladen werden, einschließlich Netzwerkquellen und lokaler Datenbanken.

Eine weitere Komponente der Paging-Bibliothek, die Sie möglicherweise verwenden, ist RemoteMediator. Ein RemoteMediator-Objekt verarbeitet das Paging aus einer mehrschichtigen Datenquelle, z. B. einer Netzwerkdatenquelle mit einem lokalen Datenbankcache.

ViewModel-Ebene

Die Komponente Pager bietet eine öffentliche API zum Erstellen von Instanzen von PagingData, die in reaktiven Streams verfügbar sind. Die Erstellung basiert auf einem PagingSource-Objekt und einem PagingConfig-Konfigurationsobjekt.

Die Komponente, die die ViewModel-Ebene mit der Benutzeroberfläche verbindet, ist PagingData. Ein PagingData-Objekt ist ein Container für einen Snapshot von paginierten Daten. Es wird ein PagingSource-Objekt abgefragt und das Ergebnis wird gespeichert.

UI-Ebene

Die primäre Paging-UI-API ist collectAsLazyPagingItems(). Sie stellt ausgelagerte Elemente als Liste von Daten bereit, die von den Lazy-Layout-Komponenten von Compose wie LazyColumn und LazyRow einfach verwendet werden können.

Fügen Sie die androidx.paging:paging-compose-Bibliothek hinzu, um Compose-kompatible APIs zu verwenden, mit denen die Benutzeroberfläche automatisch auf Datenladevorgänge, Aktualisierungen und Fehler reagieren kann, ohne dass Adapter oder Differenzierungslogik erforderlich sind. Verwenden Sie die Erweiterungsfunktion collectAsLazyPagingItems() für einen Flow<PagingData>, um den zurückgegebenen LazyPagingItems in einem LazyColumn an items() zu übergeben.

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

Weitere Informationen finden Sie unter Große Datasets (Paging).