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

Что такое лишняя рекомпозиция?

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

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

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

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

Что такое лишняя рекомпозиция?

Лишняя (ненужная) рекомпозиция — это повторное выполнение функции Composable, которое не приводит к видимым изменениям на экране. Это одна из основных причин деградации производительности в Jetpack Compose.

Когда происходит рекомпозиция?

Rekompozitsiya запускается когда:

  • Изменяется состояние (State), от которого зависит Composable
  • Изменяется внешний @Stable параметр
  • Родительский Composable перерисовывается

Примеры лишней рекомпозиции

Плохо — создаём новый объект при каждой рекомпозиции:

@Composable
fun UserCard(name: String) {
    val userData = Data(name)
    Text(name)
}

Хорошо — создаём объект только когда name меняется:

@Composable
fun UserCard(name: String) {
    val userData = remember(name) { Data(name) }
    Text(name)
}

Проблемы лишней рекомпозиции

  • Снижение производительности: лишние вычисления потребляют CPU
  • Избыточное использование памяти: промежуточные объекты не удаляются
  • Батарея садится быстрее: телефон работает интенсивнее
  • UI могут подтормаживать: особенно на слабых устройствах

Как предотвратить лишнюю рекомпозицию?

1. Используй remember() для стабилизации объектов:

@Composable
fun Counter() {
    var count by remember { mutableStateOf(0) }
    Button(onClick = { count++ })
}

2. Используй @Stable и @Immutable аннотации:

@Immutable
data class User(val id: Int, val name: String)

@Composable
fun ShowUser(user: User) {
    // не вызовет рекомпозицию если значение не изменилось
}

3. Выноси состояние вверх (State Hoisting):

@Composable
fun UserList() {
    var selectedId by remember { mutableStateOf(-1) }
    LazyColumn {
        items(users) { user ->
            UserItem(user, selectedId)
        }
    }
}

4. Используй key() для управления идентификацией:

LazyColumn {
    items(users, key = { it.id }) { user ->
        UserCard(user)
    }
}

5. Разделяй Composable на мелкие компоненты:

@Composable
fun UserProfile(userId: Int) {
    var isExpanded by remember { mutableStateOf(false) }
    Column {
        UserHeader(userId)
        if (isExpanded) UserDetails(userId)
    }
}

Инструменты для отладки

  • Compose Compiler Reports — показывает какие Composable рекомпилируются
  • Android Profiler — мониторит CPU, память, GPU
  • Layout Inspector — визуализирует иерархию компонентов

Получение лишней рекомпозиции — частый источник проблем с производительностью, поэтому важно о ней знать и уметь предотвращать.