Главный поток и плавность UI
Вопрос
Как устроен главный поток Android и как ты не допускаешь подвисаний интерфейса?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
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 ошибок.