Kotlin
January 4, 2024

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

Мне кажется, я придумал очень простой вопрос, который можно задать любому андроид-разработчику, при этом ответ будет либо совсем неправильным, либо неточным (а это по сути неправильный)

Признаюсь, когда я придумал его, мое лицо стало прямо как на картинке ниже:

Лицо человека, знающего правильный ответ

Ладно, не буду томить и сразу перейдем к сути. Только давайте договоримся, что не будем гуглить, а сначала подумаем.

Итак, я понимаю, ты ожидаешь какой-то хитрый вопрос, где есть какой-то подвох.
Спойлер -- подвоха НЕТ.

Просто отвечай так, как тебе подсказывает твоя голова.

У нас есть вот такой код:

В onCreate мы просто блокируем главный поток на довольно большое время.
Вопрос: что произойдет с программой? Ответ объясни.

Вот прямо сейчас остановись и дальше не читай. Напиши свой ответ в комментарии, а потом можешь прочитать все, что находится ниже.


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

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

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

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

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

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

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

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

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

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

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

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

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

Источник