Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Мне кажется, я придумал очень простой вопрос, который можно задать любому андроид-разработчику, при этом ответ будет либо совсем неправильным, либо неточным (а это по сути неправильный)
Признаюсь, когда я придумал его, мое лицо стало прямо как на картинке ниже:
Ладно, не буду томить и сразу перейдем к сути. Только давайте договоримся, что не будем гуглить, а сначала подумаем.
Итак, я понимаю, ты ожидаешь какой-то хитрый вопрос, где есть какой-то подвох.
Спойлер -- подвоха НЕТ.
Просто отвечай так, как тебе подсказывает твоя голова.
У нас есть вот такой код:
В onCreate мы просто блокируем главный поток на довольно большое время.
Вопрос: что произойдет с программой? Ответ объясни.
Вот прямой сейчас остановись и дальше не читай. Напиши свой ответ в комментарии, а потом можешь прочитать все, что находится ниже.
Не открывай спойлер раньше времени, не совершай ошибку :-)
Итак, если ты ответил, что будет ANR, то поздравляю - ты абсолютно нормальный человек, у тебя скорее всего много друзей, есть девушка и в целом в жизни все прекрасно. Но ответ неправильный..
Давай разбираться, в чем дело.
1) Дело в runBlocking? Может там диспатчер какой-то необычный?
Ну, это было бы подло назвать вопрос по Android Core, а сам вопрос лежал бы в корутинах. То есть дело не в runBlocking. Он работает так, как ожидается. Просто блокирует текущий поток.
2) Получается дело в самом ANR?
Да, уже очень тепло, осталось вспомнить один момент.
Слово ANR и блокировка потока всегда звучат рядом, когда заходит об этом речь. Мы обычно думаем, что раз поток заблокирован, то через 5 секунд появится окошко: "Приложение не отвечает"
А теперь кульминация: условие для возникновения ANR - это когда входные события (кнопки и сенсорные события) не обрабатываются в течение 5 секунд.
Я думаю, уже стало все понятно, но лучше проговорим.
У нас запускается приложение, в onCreate мы блокируем поток, поэтому другие методы ЖЦ не вызываются. onResume не вызвался, поэтому взаимодействовать с UI мы не можем.
Если взаимодействовать с UI мы не можем, то и условие для ANR мы не выполним. Поэтому приложение будет благополучно ждать, пока мы разблокируем поток, и запустится как обычно.
Интересно, что необязательно нажать на кнопки или другие элементы UI. Можно нажать просто в любую точку экрана и ANR появится.
Возможно, эта инфа не особо важная, без нее жить можно. В реальной разработке ты словишь ANR в любом случае, так как будет тыкать на экран. Но по-моему забавно, так как мы все понимаем, что человек умирает не от сигарет, а от рака, который был спровоцирован сигаретами.
PS
Кто ответил правильно сразу - респект, но, пожалуйста, не забывайте выходить на улицу (без негатива).