Вот более подробное объяснение:
Choreographer позволяет приложениям подключаться к vsync и правильно рассчитывать время для повышения производительности.
Android-анимация для внутреннего просмотра использует Choreographer для той же цели: для правильного определения времени анимации и, возможно, для повышения производительности.
Так как Choreographer рассказывается обо всех событиях vsync, я могу сказать, не завершается ли один из Runnables, переданных с помощью Choreographer.post * apis, за один кадр, что приводит к пропуску кадров.
В моем понимании хореограф может только обнаружить пропуск кадра. Невозможно объяснить, почему это происходит.
Сообщение «Приложение может выполнять слишком много работы в своем основном потоке». может вводить в заблуждение.
источник:
смысл сообщений хореографа в Logcat
Почему вы должны быть обеспокоены
Когда это сообщение появляется на эмуляторе Android, а количество пропущенных кадров довольно мало (<100), вы можете сделать безопасную ставку на медленный эмулятор - что происходит почти все время. Но если количество пропущенных и больших кадров составляет порядка 300+, то с вашим кодом могут возникнуть серьезные проблемы. Устройства Android поставляются с огромным количеством аппаратного обеспечения, в отличие от устройств на базе iOS и Windows. Оперативная память и процессор различаются, и если вы хотите разумную производительность и удобство работы на всех устройствах, вам нужно исправить это. Когда кадры пропускаются, пользовательский интерфейс работает медленно и медленно, что нежелательно для пользователя.
Как это исправить
Исправление этого требует идентификации узлов, где есть или может произойти большая продолжительность обработки. Лучший способ - выполнять всю обработку независимо от того, насколько она мала или велика в отдельном от основного потока пользовательского интерфейса. Так что будь то доступ к данным из базы данных SQLite или выполнение какой-то жесткой математики или просто сортировка массива - сделайте это в другом потоке
Теперь здесь есть одна загвоздка: вы создадите новый поток для выполнения этих операций, и при запуске приложения произойдет сбой, сказав, что «только исходный поток, создавший иерархию представлений, может касаться его представлений». Вы должны знать, что пользовательский интерфейс в Android может быть изменен только основным потоком или потоком пользовательского интерфейса. Любой другой поток, который пытается это сделать, завершается сбоем и вылетает с этой ошибкой. Вам нужно создать новый Runnable внутри runOnUiThread, и внутри этого runnable вы должны выполнять все операции, связанные с пользовательским интерфейсом. Найдите пример здесь .
Итак, у нас есть Thread и Runnable для обработки данных из основного потока, что еще? В Android есть AsyncTask, который позволяет выполнять длительные процессы в потоке пользовательского интерфейса. Это наиболее полезно, когда ваши приложения управляются данными или веб-API или используют сложные пользовательские интерфейсы, подобные тем, которые создаются с использованием Canvas. Сила AsyncTask заключается в том, что она позволяет делать вещи в фоновом режиме, и как только вы закончите обработку, вы можете просто выполнить необходимые действия в пользовательском интерфейсе, не вызывая какого-либо запаздывающего эффекта. Это возможно, потому что AsyncTask происходит из потока пользовательского интерфейса Activity - все операции, которые вы выполняете в пользовательском интерфейсе через AsyncTask, выполняются в другом потоке, отличном от основного потока пользовательского интерфейса. Никаких помех для взаимодействия с пользователем.
Так что это то, что вам нужно знать для создания гладких приложений для Android, и, насколько я знаю, каждый новичок получает это сообщение на своей консоли.