Какие средства в Android используются для переноса долгих операций с главного потока
Androidасинхронностьмногопоточностьпотокиразработка под Android
Что проверяют
Знаете ли вы современный набор и понимаете ли, что выбор зависит от времени жизни задачи, а не от её длительности.
Как отвечать
Правило одно: главный поток занят отрисовкой, и всё, что длится дольше кадра, должно уйти с него.
Инструменты по времени жизни задачи:
- корутины: основной способ.
viewModelScopeдля работы, связанной с экраном,withContext(Dispatchers.IO)для сети и диска,Dispatchers.Defaultдля вычислений. Отмена приходит вместе с уничтожением области; - Flow: для потоков данных,
flowOnпереносит верхнюю часть цепочки в другой контекст; - WorkManager: работа должна выполниться, даже если приложение закрыли или устройство перезагрузили. Синхронизация, выгрузка, отправка отложенных событий;
- foreground-сервис: длительная работа, видимая пользователю, с уведомлением. Музыка, навигация, запись;
- RxJava: живой вариант в проектах, где он уже есть;
- Executor и HandlerThread: низкий уровень, обычно только в старом коде или в библиотеках;
- AsyncTask: удалён, упоминать как рабочий вариант нельзя.
Отдельно стоит назвать, чем меряют: StrictMode ловит дисковые и сетевые операции на главном потоке, а пропущенные кадры видны в Profiler.
Где спотыкаются
Называют AsyncTask.
Считают, что сервис сам по себе создаёт поток.
Берут Dispatchers.IO для тяжёлых вычислений, занимая потоки, предназначенные для ожидания.
Запускают корутину в GlobalScope, из-за чего она переживает экран и течёт.