Omówienie biblioteki Paging   Jest częścią Android Jetpack.

Biblioteka Paging pomaga wczytywać i wyświetlać strony danych z większego zbioru danych z pamięci lokalnej lub przez sieć. Dzięki temu aplikacja może wydajniej wykorzystywać zarówno przepustowość sieci, jak i zasoby systemowe. Komponenty biblioteki Paging są zaprojektowane tak, aby pasowały do zalecanej architektury aplikacji na Androida, bezproblemowo integrowały się z innymi komponentami Jetpack i zapewniały najwyższej klasy obsługę Kotlina.

Zalety korzystania z biblioteki Paging

Biblioteka Paging zawiera te funkcje:

  • Buforowanie w pamięci podręcznej pamięci RAM danych podzielonych na strony. Dzięki temu aplikacja będzie efektywnie korzystać z zasobów systemowych podczas pracy z danymi podzielonymi na strony.
  • Wbudowana deduplikacja żądań, która pomaga zapewnić, że aplikacja efektywnie wykorzystuje przepustowość sieci i zasoby systemowe.
  • Najwyższej klasy obsługa współprogramów i przepływów w języku Kotlin.
  • Wbudowana obsługa błędów, w tym możliwość odświeżania i ponawiania prób.

Konfiguracja

Aby zaimportować komponenty stronicowania do aplikacji na Androida, dodaj do pliku build.gradle aplikacji te zależności:

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

Dynamiczny

dependencies {
  def paging_version = "3.4.2"

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

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

Architektura biblioteki

Komponenty biblioteki Paging działają w 3 warstwach aplikacji:

  • Warstwa repozytorium
  • Warstwa ViewModel
  • Warstwa interfejsu
Ilustracja pokazująca przepływy danych ze stronicowaniem z komponentów PagingSource lub RemoteMediator w warstwie repozytorium do komponentu Pager w warstwie ViewModel.
    Następnie komponent Pager udostępnia Flow danych PagingData komponentom układu Lazy w warstwie interfejsu.
Rysunek 1. Przykład dopasowania biblioteki Paging do architektury aplikacji.

W tej sekcji opisujemy komponenty biblioteki Paging, które działają w poszczególnych warstwach, oraz sposób, w jaki współpracują ze sobą, aby wczytywać i wyświetlać dane podzielone na strony.

Warstwa repozytorium

Głównym komponentem biblioteki Paging w warstwie repozytorium jest PagingSource. Każdy obiekt PagingSource definiuje źródło danych i sposób pobierania danych z tego źródła. Obiekt PagingSource może wczytywać dane z dowolnego pojedynczego źródła, w tym ze źródeł sieciowych i lokalnych baz danych.

Innym komponentem biblioteki Paging, którego możesz użyć, jest RemoteMediator. Obiekt RemoteMediator obsługuje stronicowanie z warstwowego źródła danych, takiego jak sieciowe źródło danych z lokalną pamięcią podręczną bazy danych.

Warstwa ViewModel

Komponent Pager udostępnia publiczny interfejs API do tworzenia instancji PagingData, które są udostępniane w strumieniach reaktywnych, na podstawie obiektu PagingSource i obiektu konfiguracji PagingConfig.

Komponent, który łączy warstwę ViewModel z interfejsem, to PagingData. Obiekt PagingData to kontener na zrzut danych podzielonych na strony. Wysyła zapytanie do obiektu PagingSource i zapisuje wynik.

Warstwa UI

Główny interfejs API interfejsu stronicowania to collectAsLazyPagingItems(). Udostępnia ona elementy ze stron jako listę danych, które mogą być łatwo wykorzystywane przez komponenty układu leniwego w Compose, takie jak LazyColumn i LazyRow.

Dodaj bibliotekę androidx.paging:paging-compose, aby używać interfejsów API zgodnych z Compose, które umożliwiają interfejsowi automatyczne reagowanie na wczytywanie danych, aktualizacje i błędy bez konieczności stosowania adapterów czy logiki porównywania. Użyj funkcji rozszerzenia collectAsLazyPagingItems() w Flow<PagingData>, aby przekazać zwrócony obiekt LazyPagingItems do items() w 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()
            }
        }
    }
}

Więcej informacji znajdziesz w sekcji Duże zbiory danych (stronicowanie).