все anr android что это
Русские Блоги
Подробный ANR оптимизации приложений для Android
Чтобы облегчить чтение, меня пригласили перенести серию статей по оптимизации производительности Android-приложений в исходные Nuggets.
Новую функцию «Сборник» в Nuggets можно использовать для создания серии эссе.
Давайте поговорим сегодня об ANR.
1, сталкивались ли вы с ANR
Во время использования Приложения вы могли столкнуться с такой ситуацией:
Поздравляем, это легендарный ANR.
1.1 Что такое ANR
1.2 Почему генерируется ANR
В Android за быстродействием приложения следят системные службы Activity Manager и Window Manager. Как правило, диалоговое окно ANR появляется в следующих двух ситуациях:
1.3 Как избежать ANR
Зная причину ANR, очень просто избежать ANR, всего одно правило:
Не выполняйте тяжелых операций в основном потоке (потоке пользовательского интерфейса).
На самом деле это связано с двумя проблемами:
2, анализ ANR
2.1 Получите файл трассировки, созданный ANR
При генерации ANR система сгенерирует файл traces.txt и поместит его в / data / anr /. Вы можете передатьadbКоманда для локального экспорта:
2.2 Анализ traces.txt
2.2.1 ANR, вызванный обычной блокировкой
Полученный файл tracs.txt обычно выглядит следующим образом:
Следующим образомGithubAppВ качестве примера возьмем код: ANR, созданный потоком принудительного сна.
Получите трассировочную информацию, все легко сказать.
Как в приведенной выше информации о трассировкеДобавлен комментарий на китайском языкеОн в основном объяснил, как анализировать файл трассировки:
Вышеупомянутая трассировка ANR относительно проста, и возможно, что вы не выполнили слишком трудоемких операций в основном потоке, но это все еще ANR. Это могут быть следующие две ситуации:
2.2.2 Полная загрузка процессора
Информация трассировки, которую вы видите сейчас, может содержать такую информацию:
Последнее предложение указывает:
Анализируя стек вызовов метода в это время, обычно обнаруживается, что метод имеет частые операции чтения и записи файла или чтения и записи базы данных в основном потоке.
2.2.3 Причина памяти
Фактически, память может вызвать ANR. Например, если в Приложении осталось мало памяти из-за утечки памяти, мы нажимаем кнопку, чтобы запустить большое изображение в качестве фонового действия, и ANR может быть сгенерирован. В это время информация трассировки может быть такой:
Как видите, свободной памяти осталось не так много.
2.2 Обработка ANR
Для трех различных ситуаций общая обработка выглядит следующим образом
Основной поток заблокирован
Создайте отдельный подпоток для обработки длительных блокирующих транзакций.
ЦП полностью загружен, ввод-вывод заблокирован
Блокировка ввода-вывода обычно означает, что чтение и запись файла или операции с базой данных выполняются в основном потоке, а также могут выполняться асинхронно, открывая дочерние потоки.
Недостаточно памяти
Увеличьте память виртуальной машины, используйте атрибут largeHeap, проверьте наличие утечек памяти (это обсуждается в главе об оптимизации памяти) и т. Д.
3, иди глубже
Никто не хочет решать проблему после того, как она возникла.
Разница между мастером и новичком заключается в том, что мастер знает, как избежать проблемы с самого начала. Итак, для проблемы ANR, какой уровень работы нам нужно сделать, чтобы ее избежать?
3.1 Какие места выполняются в основном потоке
3.2 Как можно использовать дочерние потоки
3.2.1 Запуск режима резьбы
Именно так Java реализует многопоточность.Существует два метода реализации, наследующие Thread или реализующие интерфейс Runnable:
Наследовать тему
Реализуйте интерфейс Runnable
3.2.2 Использование AsyncTask
Это уникальный способ для Android. AsyncTask, как следует из названия, означает асинхронную задачу.
3.2.3 HandlerThread
Способ объединения обработчика и потока в Android. Перед ним облако. По умолчанию handleMessage обработчика выполняется в основном потоке, но если я передаю цикл дочернего потока этому обработчику, handleMessage будет выполняться в этом дочернем потоке. В HandlerThread есть как раз такая комбинация:
3.2.4 IntentService
Служба работает в основном потоке, но IntentService работает в дочернем потоке.
Фактически, IntentService реализует модель HandlerThread + ServiceHandler.
Пример кода вышеупомянутого HandlerThread также взят изИсходный код IntentService.
3.2.5 Loader
Загрузчик данных, представленный в Android 3.0, может использоваться в Activity / Fragment. Он поддерживает асинхронную загрузку данных и может отслеживать источник данных для получения новых результатов при изменении данных. CursorLoader обычно используется для загрузки данных из базы данных.
3.2.6 Особое внимание
При использовании Thread и HandlerThread, чтобы эффект был лучше, рекомендуется установить приоритет Thread немного ниже:
Потому что, если вы не устанавливаете какой-либо приоритет, вы знаете, что создаваемый поток по умолчанию имеет тот же приоритет, что и поток пользовательского интерфейса. Поток с таким же приоритетом, планирование ЦП может по-прежнему блокировать ваш поток пользовательского интерфейса, Причина ANR.