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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 126
  • Облачные технологии14 083
  • QA вакансии3 456
  • Backend вакансии2 115
  • Инженер данных1 809
  • Продакт-менеджер1 261

Разработка

  • Android1 862
  • iOS1 700
  • Fullstack вакансии986
  • AI вакансии950
  • Frontend вакансии744
  • Mobile вакансии44

По стеку

  • Go8 688
  • Java6 537
  • Node.js2 026
  • .NET1 722
  • Kotlin1 611
  • Rust1 458
  • C#710
  • PHP682
  • C++571

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

  • Kubernetes7 772
  • DevOps вакансии6 054
  • Linux-инфраструктура5 493
  • Terraform / IaC4 275
  • CI/CD3 239
  • Мониторинг и Observability1 790
  • SRE568
  • Кибербезопасность458

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

  • Data Scientist1 143
  • Бизнес-аналитик923
  • Аналитик данных857
  • Системный аналитик152

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

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

По регионам

  • Вакансии в США44 276
  • Вакансии в Европе23 819
  • Вакансии в Канаде4 471
  • Работа в России3 904

По формату

  • Удалённые вакансии74 928
  • Релокация в США44 273
  • Гибридная работа12 388
  • Офисная работа7 083

По уровню

  • Senior вакансии42 625
  • Middle вакансии20 854
  • Junior вакансии6 721

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

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis39 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 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