*** Пожалуйста, проверьте ваш код, вы выполняете что-нибудь тяжелое задание в основном потоке пользовательского интерфейса, которое блокирует пользовательский интерфейс и вызывает «Приложение не отвечает», которое, по-видимому, зависло на вашем устройстве.
Вы можете выполнять тяжелую задачу в фоновом потоке, чтобы избежать ANR.
Пожалуйста, пройдите ниже примечания ***
Как правило, система отображает ANR, если приложение не может ответить на ввод пользователя. Например, если приложение блокирует какую-либо операцию ввода-вывода (часто доступ к сети) в потоке пользовательского интерфейса, поэтому система не может обрабатывать входящие события ввода пользователя. Или, может быть, приложение тратит слишком много времени на создание сложной структуры в памяти или вычисление следующего хода в игре в потоке пользовательского интерфейса. Всегда важно убедиться, что эти вычисления эффективны, но даже самый эффективный код все еще требует времени для запуска.
В любой ситуации, когда ваше приложение выполняет потенциально длительную операцию, вы не должны выполнять работу над потоком пользовательского интерфейса, а вместо этого создавать рабочий поток и выполнять большую часть работы там. Это поддерживает работу потока пользовательского интерфейса (который управляет циклом событий пользовательского интерфейса) и предотвращает вывод системы о том, что ваш код заморожен. Поскольку такая многопоточность обычно выполняется на уровне класса, вы можете думать об отзывчивости как о проблеме класса. (Сравните это с базовой производительностью кода, которая касается уровня метода.)
В Android за отзывчивостью приложений следят системные службы Activity Manager и Window Manager. Android отобразит диалоговое окно ANR для определенного приложения, когда обнаружит одно из следующих условий:
Нет ответа на событие ввода (например, нажатие клавиши или события касания экрана) в течение 5 секунд.
BroadcastReceiver не завершил работу в течение 10 секунд.
Как избежать ANR
Приложения Android обычно работают полностью в одном потоке (по умолчанию «поток пользовательского интерфейса» или «основной поток»). Это означает, что все, что ваше приложение делает в потоке пользовательского интерфейса, выполнение которого занимает много времени, может вызвать диалог ANR, поскольку ваше приложение не дает себе возможности обрабатывать входное событие или намеренные широковещательные рассылки.
Следовательно, любой метод, выполняющийся в потоке пользовательского интерфейса, должен выполнять как можно меньше работы в этом потоке. В частности, действия должны делать как можно меньше для настройки в ключевых методах жизненного цикла, таких как onCreate () и onResume (). Потенциально длительные операции, такие как операции с сетью или базой данных, или дорогостоящие вычисления, такие как изменение размера растровых изображений, должны выполняться в рабочем потоке (или в случае операций с базами данных посредством асинхронного запроса).
Наиболее эффективный способ создания рабочего потока для более длительных операций - это класс AsyncTask. Просто расширьте AsyncTask и реализуйте метод doInBackground () для выполнения работы. Чтобы опубликовать изменения прогресса для пользователя, вы можете вызвать publishProgress (), который вызывает метод обратного вызова onProgressUpdate (). Из вашей реализации onProgressUpdate () (которая выполняется в потоке пользовательского интерфейса) вы можете уведомить пользователя.