Обзор библиотеки Paging   Входит в Android Jetpack.

Библиотека Paging помогает загружать и отображать страницы данных из большого набора данных из локального хранилища или по сети. Это позволяет более эффективно использовать пропускную способность сети и системные ресурсы. Компоненты библиотеки Paging разработаны с учетом рекомендуемой архитектуры приложений Android, легко интегрируются с другими компонентами Jetpack и обеспечивают первоклассную поддержку Kotlin.

Преимущества использования библиотеки Paging

Библиотека Paging включает следующие функции:

  • Кеширование в памяти для постраничных данных. Это позволяет приложению эффективно использовать системные ресурсы при работе с данными, разбитыми на страницы.
  • Встроенная дедупликация запросов, которая помогает обеспечить эффективное использование пропускной способности сети и системных ресурсов.
  • Встроенная поддержка сопрограмм Kotlin, потоков и Jetpack Compose.
  • Встроенная поддержка обработки ошибок, включая возможности обновления и повторной попытки.
  • Специальные утилиты для тестирования, такие как TestPager и asSnapshot, для проверки источников разбивки на страницы и преобразования данных.

Настроить

Чтобы импортировать компоненты Paging в приложение для Android, добавьте в его файл build.gradle следующие зависимости:

Kotlin

dependencies {
  val paging_version = "3.5.3"

  // Needed for Android Views and LiveData. Optional if only using
  // paging-compose
  implementation("androidx.paging:paging-runtime:$paging_version")

  // Needed to collect PagingData flows in Jetpack Compose
  implementation("androidx.paging:paging-compose:$paging_version")

  // Needed to test PagingSource and PagingData transformations in isolation
  testImplementation("androidx.paging:paging-testing:$paging_version")
}

Яркий

dependencies {
  def paging_version = "3.5.3"

  // Needed for Android Views and LiveData. Optional if only using
  // paging-compose
  implementation "androidx.paging:paging-runtime:$paging_version"

  // Needed to collect PagingData flows in Jetpack Compose
  implementation "androidx.paging:paging-compose:$paging_version"

  // Needed to test PagingSource and PagingData transformations in isolation
  testImplementation "androidx.paging:paging-testing:$paging_version"
}

Архитектура библиотеки

Компоненты библиотеки Paging работают на трех уровнях приложения:

  • Уровень репозитория
  • Слой ViewModel
  • Уровень интерфейса
Изображение, показывающее потоки постраничных данных из компонентов PagingSource или RemoteMediator на уровне репозитория в компонент Pager на уровне ViewModel.
    Затем компонент Pager предоставляет поток 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()
            }
        }
    }
}

Подробнее о больших наборах данных (разбиение на страницы)…