Выполняйте длинную операцию в отдельном потоке или используйте AsyncTask, чтобы избавиться от ANR.
ANR (активность не отвечает) происходит, когда какой-то поток long operation takes place in the "main"
. Это поток цикла событий, и если он занят, Android не может обрабатывать какие-либо дальнейшие события графического интерфейса в приложении и, следовательно, выдает ANR dialog
.
Ваша активность заняла много времени, чтобы сказать ОС Android: «Эй, я все еще жив»! (Это то, что делает поток пользовательского интерфейса).
http://developer.android.com/guide/practices/design/responsiveness.html
По сути, если вы заставляете поток пользовательского интерфейса выполнять какую-то сложную задачу, он слишком занят выполнением вашей задачи, чтобы сказать ОС, что он все еще "жив".
http://android -developers.blogspot.co.uk / 2009/05 / безболезненным-threading.html
Вам следует переместить код синтаксического анализа XML в другой поток, а затем использовать обратный вызов, чтобы сообщить завершившемуся потоку пользовательского интерфейса и что-то сделать с результатом.
http://developer.android.com/resources/articles/timed-ui-updates.html
Определить, где происходят ANR, легко, если это постоянный блок (например, тупик, получающий некоторые блокировки), но сложнее, если это просто временная задержка. Сначала просмотрите свой код и найдите уязвимые места и длительные операции. Примеры могут включать в себя использование сокетов, блокировок, спящих потоков и других операций блокировки из потока событий. Вы должны убедиться, что все это происходит в отдельных потоках. Если ничто не кажется проблемой, используйте DDMS и включите представление потока. Это показывает все потоки в вашем приложении, похожие на след, который вы имеете. Воспроизведите ANR и обновите основной поток одновременно. Это должно показать вам точно, что происходит во время ANR
Если Logcat не выводит ничего полезного, попробуйте извлечь файл traces.txt из /data/anr/traces.txt
adb pull /data/anr/traces.txt .
, поскольку это может дать больше информации о том, где произошло исключение ANR
И эта ссылка также может быть полезна для создания AsyncTask и Threads