Какие виды асинхронной работы доступны на Android кроме coroutines и RxJava
Что проверяют
Знаете ли вы, на чём держится асинхронность в Android под капотом корутин, и какие инструменты нужны для работы, которая должна пережить закрытие экрана или процесса. Следом обычно спрашивают, как устроены Looper и Handler и когда брать WorkManager.
Как отвечать
Разделите инструменты на внутрипроцессные и системные. Внутри процесса:
Thread: базовый поток, всё остальное построено поверх него. Создавать руками дорого, и легко получить утечку;Handler,Looper,MessageQueue: очередь сообщений потока. Главный поток сам работает наLooper, аHandler(Looper.getMainLooper())отправляет тудаRunnable. КонструкторHandler()без явногоLooperустарел с API 30.HandlerThreadдаёт фоновый поток со своей очередью;ExecutorиExecutorService: пулы потоков изjava.util.concurrent, плюсCompletableFutureс API 24 иListenableFuture, который возвращают многие библиотеки AndroidX;- колбэки библиотек:
enqueueв OkHttp и Retrofit сами уводят запрос в фон.
Системные, для работы вне жизни экрана:
WorkManager: отложенная гарантированная работа с условиями запуска, переживает перезагрузку устройства. Периодические задачи не чаще раза в 15 минут, срочные черезsetExpedited;- foreground service: долгая заметная пользователю работа с уведомлением. С Android 14 обязательно указывать
foregroundServiceType; JobSchedulerиAlarmManager: низкоуровневые механизмы, на которых построенWorkManager. Точные будильники с Android 12 требуют отдельного разрешения.
Устаревшее назовите с причиной: AsyncTask объявлен устаревшим в API 30 из-за утечек Activity и проблем с поворотом экрана, Loader в API 28, его заменили ViewModel и LiveData.
Где спотыкаются
Предлагают AsyncTask как рабочий вариант. Это сразу выдаёт устаревшие знания.
Берут WorkManager для загрузки, которая нужна прямо сейчас по нажатию кнопки. Он про гарантию выполнения, а не про момент: система вправе задачу отложить.
Отправляют анонимный Runnable через postDelayed. Он захватывает Activity и держит её в памяти после закрытия, поэтому в onDestroy вызывают removeCallbacksAndMessages(null).