Что такое PrecomputedText?
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое PrecomputedText?
PrecomputedText — это API, введённый в Android 9 (API 28) и доступный через Jetpack в библиотеке androidx.core:core, который оптимизирует измерение и отрисовку текста, особенно для больших объёмов текста или в сценариях с высокими требованиями к производительности (например, в RecyclerView). Он предварительно вычисляет макет текста в фоновом потоке, чтобы избежать дорогостоящих операций на основном потоке (UI-потоке) во время отрисовки, что уменьшает "тормоза" и улучшает плавность интерфейса.
Проблема, которую решает PrecomputedText
При отображении текста в TextView система выполняет несколько тяжёлых операций:
- Анализ текста: разбивка на строки, символы.
- Измерение макета (layout): вычисление позиций символов, переносов строк, высоты и ширины текста.
- Отрисовка: непосредственное рисование текста на 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, особенно в современных приложениях с динамическим контентом. Его внедрение требует умеренных усилий, но даёт заметный прирост производительности, что улучшает пользовательский опыт и рейтинг приложения в магазинах. Рекомендуется к использованию в проектах с интенсивной работой с текстом или высокими требованиями к плавности интерфейса.