Какие технологии использовались для синхронной работы
Что проверяют
Скорее всего, речь об асинхронной работе и многопоточности: как не блокировать главный поток и как безопасно делить данные между потоками. Если формулировка непонятна, уточните, что имеется в виду: фоновые задачи, синхронизация потоков или синхронизация данных с сервером. Следом обычно спрашивают про отмену задач и жизненный цикл.
Как отвечать
Начните с правила: главный поток отвечает за интерфейс, и если он не обработает ввод примерно за пять секунд, система покажет ANR. Поэтому сеть, база и тяжёлые вычисления уходят в фон.
Инструменты по степени актуальности:
- Kotlin Coroutines: основной подход.
viewModelScopeиlifecycleScopeотменяют работу вместе с владельцем,withContext(Dispatchers.IO)для ввода-вывода,Dispatchers.Defaultдля вычислений. Structured concurrency гарантирует, что дочерние корутины не переживут родителя; - Flow и StateFlow: потоки данных из Room и сети, сбор в UI через
repeatOnLifecycleилиcollectAsStateWithLifecycle; - WorkManager: гарантированная фоновая работа, которая переживёт закрытие приложения и перезагрузку, например синхронизация с сервером;
- Handler и Looper: низкоуровневая очередь сообщений главного потока, на ней построен
Dispatchers.Main. Напрямую используют редко; - RxJava: встречается в легаси, в новом коде обычно заменяется корутинами;
- AsyncTask: объявлен устаревшим в API 30. Держал ссылку на Activity, из-за чего получались утечки и падения при повороте экрана.
Про синхронизацию потоков: общие изменяемые данные защищают Mutex из kotlinx.coroutines (внутри synchronized suspend-вызовы запрещены), атомарными типами или доступом только из одного потока. MutableStateFlow.update {} меняет состояние атомарно.
Приведите свой пример: какую задачу вынесли в фон и как обработали отмену при уходе с экрана.
Где спотыкаются
Называют AsyncTask рабочим вариантом. Это прямой признак устаревших знаний.
Запускают корутины в GlobalScope или без привязки к жизненному циклу и получают утечки и обновление уже уничтоженного экрана.
Вызывают блокирующий код в Dispatchers.Main или runBlocking в UI, считая, что корутина сама по себе делает код асинхронным.