Ответ вслух Middle Многопоточность и WorkManager обновлено

Главный поток и плавность UI

Вопрос

Как устроен главный поток Android и как ты не допускаешь подвисаний интерфейса?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Главный поток это поток с Looper, который по очереди достаёт сообщения: ввод, кадры отрисовки, колбэки жизненного цикла, задачи из Handler.post и продолжения корутин на Dispatchers.Main. Пока выполняется одна задача, остальные ждут.

Что должно прозвучать в ответе

  • Looper и MessageQueue, Handler кладёт задачи

  • Бюджет кадра 16 мс при 60 Гц

  • Диск, сеть, база, тяжёлые вычисления только в фоне через корутины

  • Main-safe suspend-функции с withContext

  • StrictMode в debug ловит диск и сеть на главном потоке

  • Профилирование: Perfetto, Android Studio Profiler

Что могут спросить следом

  • Что такое jank?
  • Как найти, что блокирует главный поток?

Разбор

Главный поток это поток с Looper, который по очереди достаёт сообщения: ввод, кадры отрисовки, колбэки жизненного цикла, задачи из Handler.post и продолжения корутин на Dispatchers.Main. Пока выполняется одна задача, остальные ждут. На кадр при 60 Гц есть около 16 мс, при 120 Гц около 8, поэтому всё тяжёлое уводится с главного потока: сеть, диск, база, разбор больших JSON, декодирование картинок. Свои suspend-функции делаю main-safe: репозиторий сам переключается через withContext(Dispatchers.IO), и вызывать его можно откуда угодно. В debug включаю StrictMode, который подсвечивает обращения к диску и сети на главном потоке. Если интерфейс подтормаживает, смотрю трассу в Perfetto или профайлере Android Studio и ищу длинные задачи на главном потоке.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.