Omówienie biblioteki Paging   części Androida Jetpack.

Biblioteka Paging pomaga wczytywać i wyświetlać strony danych z większego zbioru danych przechowywanego lokalnie lub w sieci. Dzięki temu aplikacja może wydajniej korzystać z przepustowości sieci i zasobów systemowych. Komponenty biblioteki Paging są zaprojektowane tak, aby pasowały do zalecanej architektury aplikacji na Androida, dobrze integrowały się z innymi komponentami Jetpack i zapewniały obsługę języka Kotlin na najwyższym poziomie.

Zalety korzystania z biblioteki Paging

Biblioteka Paging obejmuje te funkcje:

  • Pamięć podręczna w pamięci na potrzeby danych podzielonych na strony. Dzięki temu aplikacja może wydajnie korzystać z zasobów systemowych podczas pracy z danymi podzielonymi na strony.
  • Wbudowana deduplikacja żądań, która pomaga aplikacji wydajnie korzystać z przepustowości sieci i zasobów systemowych.
  • Obsługa na najwyższym poziomie korutyn i przepływów w języku Kotlin.
  • Wbudowana obsługa obsługi błędów, w tym możliwości odświeżania i ponawiania.

Konfiguracja

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

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ływ danych podzielonych na strony z komponentów PagingSource lub RemoteMediator w warstwie repozytorium do komponentu Pager w warstwie ViewModel.
    Następnie komponent Pager udostępnia przepływ PagingData komponentom układu leniwego w warstwie interfejsu.
Rysunek 1. Przykład tego, jak biblioteka Paging pasuje do architektury aplikacji.

W tej sekcji opisujemy komponenty biblioteki Paging, które działają w każdej warstwie, 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 określa źródło danych i sposób ich pobierania 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żywać, jest RemoteMediator. Obiekt RemoteMediator obsługuje stronicowanie z warstwowego źródła danych, takiego jak źródło danych sieciowych 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.

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

Warstwa interfejsu

Głównym interfejsem API Paging UI jest collectAsLazyPagingItems(). Udostępnia on elementy podzielone na strony jako listę danych, które mogą być łatwo wykorzystywane przez komponenty układu leniwego Compose, takie jak LazyColumn i LazyRow.

Aby używać interfejsów API zgodnych z Compose, które umożliwiają automatyczne reagowanie interfejsu na wczytywanie, aktualizacje i błędy danych bez konieczności używania adapterów ani logiki różnicowania, dodaj bibliotekę androidx.paging:paging-compose. Użyj funkcji rozszerzenia collectAsLazyPagingItems() w Flow<PagingData> , aby przekazać zwrócony 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 artykule Duże zbiory danych (stronicowanie).