← Назад к вопросам

Что такое PrecomputedText?

2.0 Middle🔥 232 комментариев
#UI и вёрстка#Производительность и оптимизация

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое PrecomputedText?

PrecomputedText — это API, введённый в Android 9 (API 28) и доступный через Jetpack в библиотеке androidx.core:core, который оптимизирует измерение и отрисовку текста, особенно для больших объёмов текста или в сценариях с высокими требованиями к производительности (например, в RecyclerView). Он предварительно вычисляет макет текста в фоновом потоке, чтобы избежать дорогостоящих операций на основном потоке (UI-потоке) во время отрисовки, что уменьшает "тормоза" и улучшает плавность интерфейса.

Проблема, которую решает PrecomputedText

При отображении текста в TextView система выполняет несколько тяжёлых операций:

  1. Анализ текста: разбивка на строки, символы.
  2. Измерение макета (layout): вычисление позиций символов, переносов строк, высоты и ширины текста.
  3. Отрисовка: непосредственное рисование текста на Canvas. Без оптимизации эти операции происходят на UI-потоке в момент вызова setText(), что может вызывать пропуск кадров (jank), особенно для длинных текстов или при быстрой прокрутке.

Как работает PrecomputedText?

PrecomputedText выполняет этапы анализа и измерения макета асинхронно, до того как текст будет передан в TextView. Результат сохраняется в объекте, который можно повторно использовать (например, для одинаковых текстов в RecyclerView). Основные шаги:

  • Предварительное вычисление: создание PrecomputedText в фоновом потоке с использованием PrecomputedTextCompat.getTextFuture() или PrecomputedTextCompat.create().
  • Применение к TextView: передача предвычисленного объекта в TextView через setText() (совместимые методы есть в TextViewCompat).
  • Кэширование: объект неизменяем, поэтому его можно безопасно кэшировать и использовать многократно.

Пример использования

Допустим, у вас есть RecyclerView с элементами, содержащими текст. В адаптере:

// В фоновом потоке (например, с помощью Coroutines или AsyncTask)
val textParams = TextViewCompat.getTextMetricsParams(textView)
val precomputedText = PrecomputedTextCompat.create(longText, textParams)

// На основном потоке, при связывании ViewHolder
TextViewCompat.setPrecomputedText(holder.textView, precomputedText)

Для асинхронной загрузки с LiveData или RecyclerView можно использовать:

// Создание с помощью ListenableFuture (совместимость с Kotlin Coroutines)
val future = PrecomputedTextCompat.getTextFuture(
    longText,
    TextViewCompat.getTextMetricsParams(textView),
    executor // Фоновый Executor
)
future.addListener(
    { 
        // При завершении: устанавливаем текст на UI-потоке
        TextViewCompat.setPrecomputedText(textView, future.get())
    },
    ContextCompat.getMainExecutor(context)
)

Ключевые преимущества

  • Улучшение производительности: перенос вычислений макета текста с UI-потока уменьшает нагрузку на основной поток, что критично для плавности анимаций и прокрутки. Тесты Google показывают до 90% сокращения времени на измерение текста.
  • Поддержка больших текстов: эффективен для статей, лент новостей, чатов.
  • Совместимость: доступен через AndroidX (androidx.core.widget.TextViewCompat), что обеспечивает работу на старых версиях Android (до API 21).
  • Интеграция с RecyclerView: идеально подходит для прокручиваемых списков, где элементы с текстом быстро появляются на экране.

Ограничения и лучшие практики

  • Используйте для сложных текстов: для коротких текстов (например, кнопки) выгода минимальна, но для абзацев — значительна.
  • Избегайте избыточного создания: кэшируйте PrecomputedText, особенно если текст повторяется (например, в шаблонных сообщениях).
  • Настройка параметров: убедитесь, что TextMetricsParams (например, textSize, typeface) соответствуют параметрам TextView, иначе система пересчитает макет.

Сравнение с альтернативами

  • AsyncLayoutInflater: оптимизирует загрузку макетов, но не текст.
  • Стандартный setText(): простой, но блокирует UI.
  • PrecomputedText: специализирован для текста, предлагает баланс между сложностью и производительностью.

В итоге, PrecomputedText — это мощный инструмент для оптимизации отрисовки текста в Android, особенно в современных приложениях с динамическим контентом. Его внедрение требует умеренных усилий, но даёт заметный прирост производительности, что улучшает пользовательский опыт и рейтинг приложения в магазинах. Рекомендуется к использованию в проектах с интенсивной работой с текстом или высокими требованиями к плавности интерфейса.

Что такое PrecomputedText? | PrepBro