Простой вопрос по Android Core, на который даже сеньоры отвечают неправильно

98f6de18fb31253324afc4f0a9173a8e

Итак, если ты ответил, что будет ANR, то поздравляю — ты абсолютно нормальный человек, у тебя скорее всего много друзей, есть девушка и в целом в жизни все прекрасно. Но ответ неправильный…

Давай разбираться, в чем дело.

1) Дело в runBlocking? Может там диспатчер какой-то необычный?

Ну, это было бы подло назвать вопрос по Android Core, а сам вопрос лежал бы в корутинах. То есть дело не в runBlocking. Он работает так, как ожидается. Просто блокирует текущий поток.

2) Получается дело в самом ANR?

Да, уже очень тепло, осталось вспомнить один момент.

Слово ANR и блокировка потока всегда звучат рядом, когда заходит об этом речь. Мы обычно думаем, что раз поток заблокирован, то через 5 секунд появится окошко: «Приложение не отвечает»

А теперь кульминация: условие для возникновения ANR — это когда входные события (кнопки и сенсорные события) не обрабатываются в течение 5 секунд.

Я думаю, уже стало все понятно, но лучше проговорим.

У нас запускается приложение, в onCreate мы блокируем поток, поэтому другие методы ЖЦ не вызываются. onResume не вызвался, поэтому взаимодействовать с UI мы не можем.
Если взаимодействовать с UI мы не можем, то и условие для ANR мы не выполним. Поэтому приложение будет благополучно ждать, пока мы разблокируем поток, и запустится как обычно.

Интересно, что необязательно нажать на кнопки или другие элементы UI. Можно нажать просто в любую точку экрана и ANR появится.

Возможно, эта инфа не особо важная, без нее жить можно. В реальной разработке ты словишь ANR в любом случае, так как будет тыкать на экран. Но по-моему забавно, так как мы все понимаем, что человек умирает не от сигарет, а от рака, который был спровоцирован сигаретами.

PS
Кто ответил правильно сразу — респект, но, пожалуйста, не забывайте выходить на улицу (без негатива).

© Habrahabr.ru