Является ли "ANR" исключением или ошибкой или что?

Является ли ANR исключением, ошибкой или чем? Можем ли мы на самом деле поймать его в структуре try{} catch(){}?

Ответ 1

ANR (приложение не отвечает) не является ошибкой. Это проявляется, когда ваше приложение очень вяло и требует много времени, чтобы ответить, что заставляет пользователя ждать. Пользователь не будет ценить, если ваше приложение заставит их долго ждать. Таким образом, платформа Android дает пользователю возможность закрыть приложение. http://developer.android.com/guide/practices/design/responsiveness.html

Это происходит, когда вы выполняете длительные операции над основным потоком. Система не может обрабатывать взаимодействия пользователя в течение этого периода с момента блокировки основного потока. Решение состоит в том, чтобы выполнять тяжелые операции в рабочей нити и освобождать основной поток.

Ответ 2

Диалог приложения не отвечает (ANR)

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

Приложение, которое не реагирует быстро на взаимодействие с пользователем, будет чувствовать безответственный - задержка в несколько сотен миллисекунд заметно. Это такая пагубная проблема, что платформа Android защищает пользователи из приложений, которые слишком много работают в основном потоке.

Примечание:

Если приложение не отвечает на ввод пользователя в течение нескольких секунд, пользователь увидит диалог Application Not Response (ANR) и будет предложено выйти из приложения.

На следующем скриншоте показан типичный диалог ANR для Android:

введите описание изображения здесь

Android сильно работает, чтобы синхронизировать пользовательский интерфейс с частота обновления оборудования. Это означает, что он предназначен для перерисовки со скоростью 60 кадров в секунду второй - всего 16,67 мс за кадр. Если мы работаем над основным потоком, который принимает где угодно около 16 мс, мы рискуем повлиять на частоту кадров, что приводит к заиканию анимации, отрывной прокрутки и т.д.

В идеале, конечно, мы не хотим бросать один кадр. Янк, безответственность, и особенно ANR, предлагают очень плохой опыт работы с пользователями, что плохие отзывы и непопулярные приложения. Правило жить при создании Android приложения: не блокируйте основной поток!

Примечание:

Android предоставляет полезный строгий режим в настройках разработчика на каждом устройстве, которое будет отображаться на экране, когда приложения выполнять длительные операции над основным потоком.

Дальнейшая защита была добавлена ​​на платформу в Honeycomb (API-уровень 11) с помощью введение нового класса Exception, NetworkOnMainThreadException, подкласс исключения RuntimeException, которое вызывается, если система обнаруживает сетевую активность на основной теме.

Источник:

Асинхронное программирование на Android - второе издание - Helper Vasconcelos - июль 2016 года