Новое:Talanto осенью: фильтры с числами, отклик по шагам и каталог компаний

+1 199новых вакансий за сутки·93 838вакансий открыто сейчас·Новое:Talanto осенью: фильтры с числами, отклик по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 273
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: фильтры с числами, отклик по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 409 кандидатов открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 222
  • Облачные технологии14 171
  • QA вакансии3 456
  • Backend вакансии2 114
  • Инженер данных1 801
  • Продакт-менеджер1 247

Разработка

  • Android1 858
  • iOS1 698
  • Fullstack вакансии997
  • AI вакансии955
  • Frontend вакансии755
  • Mobile вакансии44

По стеку

  • Go8 752
  • Java6 593
  • Node.js2 036
  • .NET1 739
  • Kotlin1 618
  • Rust1 472
  • C#717
  • PHP690
  • C++579

DevOps и инфраструктура

  • Kubernetes7 787
  • DevOps вакансии6 095
  • Linux-инфраструктура5 508
  • Terraform / IaC4 287
  • CI/CD3 272
  • Мониторинг и Observability1 792
  • SRE566
  • Кибербезопасность454

Аналитика и данные

  • Data Scientist1 138
  • Бизнес-аналитик921
  • Аналитик данных858
  • Системный аналитик154

Другие направления

  • Проджект-менеджер624
  • UI/UX дизайн149
  • Ручное тестирование14

По регионам

  • Вакансии в США44 166
  • Вакансии в Европе24 014
  • Вакансии в Канаде4 535
  • Работа в России3 867

По формату

  • Удалённые вакансии75 005
  • Релокация в США44 166
  • Гибридная работа12 485
  • Офисная работа7 090

По уровню

  • Senior вакансии42 643
  • Middle вакансии20 960
  • Junior вакансии6 708

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis38 вакансий
  • Spotify37 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме Jetpack ComposeВсе вопросы
Jetpack ComposeMiddleТеория

Каков жизненный цикл composable в Jetpack Compose?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Жизненный цикл composable: Enter (появление в дереве), Recompose (перерисовка при изменении State), Leave (удаление из дерева). Не зависит от Android lifecycle. DisposableEffect очищает ресурсы при Leave, LaunchedEffect отменяет корутины.

Пример с эффектами жизненного цикла

@Composable
fun LocationTracker(userId: String) {
    val context = LocalContext.current

    // Запускается при Enter, перезапускается при смене userId, отменяется при Leave
    LaunchedEffect(userId) {
        trackLocation(userId) // suspend-функция
    }

    // Подписка на Android LocationManager с cleanup при Leave
    DisposableEffect(Unit) {
        val listener = LocationListener { location ->
            // обработка
        }
        val manager = context.getSystemService(LocationManager::class.java)
        manager.requestLocationUpdates(
            LocationManager.GPS_PROVIDER,
            1000L, 10f, listener
        )
        onDispose {
            manager.removeUpdates(listener) // Cleanup при Leave
        }
    }

    Text("Tracking $userId")
}

Жизненный цикл composable в Jetpack Compose

Жизненный цикл composable не совпадает с Android-lifecycle (Activity/Fragment). Он определяется присутствием composable в дереве composition и состоит из трёх этапов: Enter, Recompose, Leave.

Три фазы

  • Enter (Initial Composition). Composable впервые появляется в дереве. Инициализируются все remember-значения, запускаются эффекты с Unit-ключом или первым значением ключа.
  • Recomposition. Один или несколько читаемых State-объектов изменились. Compose вызывает функцию повторно, обновляя только затронутые части дерева. При одинаковых входных данных composable может быть пропущен (skipped).
  • Leave (Disposal). Composable покидает дерево (условие if стало false, навигация назад, родитель удалён). Запускается cleanup всех DisposableEffect-блоков, отменяются все LaunchedEffect-корутины.

Slot Table и идентичность

Compose хранит состояние в Slot Table, индексируя позиции по месту вызова в коде. Composable считается «тем же» между recomposition, если его позиция в дереве не изменилась. При использовании в списках уникальность гарантирует явный key(id) { ... }.

Связь с Android lifecycle

Composable и Activity/Fragment живут независимо, но их нужно явно связывать через LocalLifecycleOwner. Например, чтобы паузировать подписку при onStop:

@Composable
fun LifecycleAwareComponent() {
    val lifecycle = LocalLifecycleOwner.current.lifecycle

    DisposableEffect(lifecycle) {
        val observer = LifecycleEventObserver { _, event ->
            when (event) {
                Lifecycle.Event.ON_RESUME -> startWork()
                Lifecycle.Event.ON_PAUSE  -> stopWork()
                else -> Unit
            }
        }
        lifecycle.addObserver(observer)
        onDispose { lifecycle.removeObserver(observer) }
    }
}

Подводные камни

  • DisposableEffect без cleanup. Если зарегистрировать listener в DisposableEffect, но не удалить его в onDispose { }, он переживёт composable и вызовет утечку памяти или краш.
  • LaunchedEffect с неправильным ключом. LaunchedEffect(Unit) запустится один раз при Enter. LaunchedEffect(userId) — при каждом изменении userId. Если ключ — нестабильный объект, эффект будет перезапускаться при каждой recomposition.
  • Параллельная recomposition. В Compose 1.5+ recomposition может выполняться параллельно (если включена reuseActivation). Код внутри composable должен быть thread-safe или работать только через State.
  • remember не привязан к Navigation backstack. remember-состояние живёт столько, сколько composable находится в composition. При навигации назад с popBackStack экран пересоздаётся и состояние сбрасывается, если не использовать rememberSaveable или ViewModel.
  • Анимации удерживают composable в composition. AnimatedVisibility и AnimatedContent держат уходящий composable в дереве до конца exit-анимации. DisposableEffect-cleanup отложен соответственно.
  • Порядок эффектов не гарантирован между composable. Если два composable запускают LaunchedEffect, нет гарантии очерёдности их старта. Не полагайтесь на межкомпонентный порядок инициализации.
  • rememberCoroutineScope vs LaunchedEffect. rememberCoroutineScope() возвращает scope, привязанный к composition. Корутины в нём не отменяются при recomposition, только при Leave — это может вызвать race condition при быстрых обновлениях state.
  • ViewModel не заменяет DisposableEffect. ViewModel переживает смену конфигурации, но не отменяет Android-подписки (BroadcastReceiver, LocationListener). Cleanup платформенных ресурсов всегда должен быть в composable через DisposableEffect.

Частые вопросы на собеседовании

  • Что такое State в Jetpack Compose и как работает state hoisting?
  • Что такое recomposition и что её вызывает в Jetpack Compose?
  • В чём разница между remember и rememberSaveable?
  • Каковы лучшие практики производительности в Jetpack Compose (стабильность, пропускаемость)?

Типичные ошибки

  • Объяснять «жизненный цикл composable» только как синтаксис и не описывать поведение runtime/compiler.
  • Игнорировать важный риск: Если хранить внешние listeners без DisposableEffect, они переживают composable и создают leak.
  • Давать пример без edge case: отмены, null, recomposition, platform boundary или ошибки.

Что проверяет интервьюер

  • Формулирует суть темы «жизненный цикл composable» своими словами и связывает ее с кодом.
  • Называет механизм: Lifecycle определяется не Activity callbacks, а presence in composition, keys и state reads; effects получают cleanup при leaving.
  • Видит production-последствие: Если хранить внешние listeners без DisposableEffect, они переживают composable и создают leak.

Как вы знаете этот вопрос?

Проверить себя по теме Jetpack Compose →

Источники

  • https://developer.android.com/develop/ui/compose/lifecycle
←Предыдущий вопросВ чём разница между `LaunchedEffect`, `DisposableEffect` и `SideEffect`?Следующий вопрос→Расскажите о случае, когда вы решали проблему с Jetpack Compose: lifecycle, performance, testing, release или platform integration.

Связанные темы

Jetpack Composecomposable-lifecycle-reasoningui-state