Я уже некоторое время сражаюсь с ANR, которое происходит в одном из моих сервисов. Это очень сложно воспроизвести, и пользовательский интерфейс, кажется, имеет полную функциональность прямо перед тем, как это произойдет в 100% случаев, когда никогда не наблюдается заметного запаздывания или замерзания. У моего сервиса есть TimerTask и несколько AsyncTask, которые он запускает, и это все.
Трассировки стека, которые я получаю, когда вы сообщаете об этом с Android Market в 2.2, трудно читать, похоже, ссылка на какой-либо из моего кода не отображается напрямую, а только из классов в SDK. Может ли кто-нибудь взглянуть на stacktrace и посмотреть, сможете ли вы сказать, что происходит.
Распечатка настолько велика, что я решил отправить ее в pastebin, надеюсь, что это не противоречит правилам. http://pastebin.com/KHUD0UHW
Вот также журнал Logcat http://pastebin.com/V5xSey36
Возможно, это не ваши приложения. ANR отображается для любого текущего приложения. Однако, если другое приложение в системе действительно вынимает ваш процессор и заставляет ваше приложение голодать, ваше приложение получит ANR, поскольку оно имеет фокус пользователя. Если это так, вы ничего не можете сделать. Возможно, лучший способ проверить это - это смотреть или заставлять систему выполнять синхронизацию. Синхронизация обычно довольно тяжелая на телефоне и может вызвать плохое отставание на менее мощных телефонах.
Еще один способ проверить, есть ли у вас более медленный телефон, установить большое приложение с рынка. После того, как он войдет в фазу "Установка" после загрузки, сделайте что-то очень немного в своем приложении. Если фаза установки занимает более 5 секунд или около того, у нее есть довольно неплохая возможность сделать приложение доступным для ANR. Это из-за плохой скорости ввода-вывода при установке приложения. IO блокирует другие приложения от получения процессорного времени. Android думает, что это означает, что вы его крадете.