Возможно, вы просматривали эту ссылку во время поиска ошибки.
Хотя у меня никогда не было такой проблемы, после прочтения в Интернете это я понимаю:
Описание:
При выполнении процесса возникает ошибка ANR или приложение не отвечает
на основной поток занимает слишком много времени (что-то вроде> 5 секунд). Android
убивает этот процесс и любые связанные с ним по конструкции, чтобы сэкономить устройства
ресурсы.
Решение состоит в том, чтобы запускать дорогостоящие задачи в другом потоке, и
затем отправьте сообщение или обновите основную ветку соответственно.
См. Это: Клавиша ANR AndroidОтправкаВремя выключено
Так что в вашем случае вы можете конфликтовать с двумя разными потоками от той, которая работает долго и Android убивает их. Следующий связанный код также будет затронут.
Так что лучше классифицируйте свой код, пишите каждую новую задачу по-разному Thread,Handler
и, если вы выполняете задачу пользовательского интерфейса, используйте runOnUIThread
. Async Task
тоже очень удобно.
Другое дело - попытаться убрать зависимость кода от других. Запишите некоторые значения по умолчанию, и тогда вы сможете отправить пользователя обратно к первому заданию, если оно выполнено неправильно.
Я считаю, что ошибка связана с вашим стилем кодирования, а не с какой-либо конкретной ошибкой в вашем коде.
Вам нужно улучшить этот конкретный код, чтобы он работал эффективно, и для этого посмотрите эти 2 ссылки:
- Дизайн для отзывчивости
- Безболезненная резьба
EDIT:
Это я где-то читал и нашел эффективным,
Как исследовать ANR?
Во-первых, просмотрите код и найдите уязвимые места и длительные операции. Примеры могут включать в себя использование сокетов, блокировок, спящих потоков и других операций блокировки из потока событий. Вы должны убедиться, что все это происходит в отдельных потоках. Если ничто не кажется проблемой, используйте DDMS и включите представление потока. Это показывает все потоки в вашем приложении, похожие на след, который вы имеете. Воспроизведите ANR и обновите основной поток одновременно. Это должно показать вам точно, что происходит во время ANR
Также если ANR вызван из-за потоков?
вы можете использовать Сервис для этого,
Таким образом, ваше приложение может выполнять трудоемкие задачи внутри service.onStart (),
передача данных (например) в намерении, используемом для запуска службы.
Однако службы выполняются в главном потоке приложений. Если отдельный
нужен поток, он может быть создан сервисом внутри onStart ().
Уже есть встроенный класс, который делает это: IntentService
Также найдено одно полезное библиотечное приложение SalomonBrys / ANR-WatchDog