Ось більш детальне пояснення:
Хореограф дозволяє програмам підключитися до vsync і належним чином виділити час для покращення продуктивності.
Android-анімація для внутрішнього використання використовує «Хореограф» з тією ж метою: належним чином анімувати анімацію та, можливо, підвищити продуктивність.
Оскільки хореограф розповідає про всі події vsync, я можу сказати, чи не проходить один із Runnables, який пройшов повз Choreographer.post * apis, за один кадр, через що кадри можуть бути пропущені.
На мій погляд, хореограф може виявити лише пропуск кадру. Це не може сказати, чому це відбувається.
Повідомлення "Програма може надто багато працювати над головною темою". може ввести в оману.
джерело:
Значення повідомлень хореографа в Logcat
Чому ви повинні турбуватися
Коли це повідомлення спливає на емуляторі Android, а кількість пропущених кадрів є досить малою (<100), тоді ви можете взяти на себе безпечну ставку того, що емулятор повільний - що відбувається майже весь час. Але якщо кількість кадрів пропущена і велика і порядку 300+, то з вашим кодом можуть виникнути серйозні проблеми. Пристрої Android оснащені величезним набором апаратних засобів на відміну від пристроїв ios та Windows. Оперативна пам’ять і процесор різняться, і якщо ви хочете розумної продуктивності та користувальницької роботи на всіх пристроях, вам потрібно це виправити. Коли кадри пропускаються, користувальницький інтерфейс працює повільно і мляво, що не є бажаним досвідом користувача.
Як це виправити
Для виправлення цього потрібно ідентифікувати вузли, де існує або, можливо, може тривати тривала обробка. Найкращий спосіб - це зробити всю обробку незалежно від того, наскільки маленька чи велика в потоці, відокремленій від основної нитки інтерфейсу користувача. Нехай це буде доступ до даних у базі даних SQLite або виконання жорсткої математики або просто сортування масиву - зробіть це в іншому потоці
Тепер тут є улов. Ви створите нову тему для виконання цих операцій, і коли ви запустите свою програму, вона вийде з ладу, кажучи: "Тільки оригінальна нитка, яка створила ієрархію перегляду, може торкнутися її поглядів". Вам потрібно знати цей факт, що інтерфейс користувача в android можна змінювати лише основним потоком або потоком інтерфейсу користувача. Будь-який інший потік, який намагається це зробити, виходить з ладу і виходить з ладу з цією помилкою. Що вам потрібно зробити, це створити новий Runnable всередині runOnUiThread, а всередині цього запуску ви повинні виконати всі операції, що стосуються інтерфейсу користувача. Знайдіть приклад тут .
Отже, у нас є Thread and Runnable для обробки даних з основної теми, що ще? В android є AsyncTask, який дозволяє робити тривалі процеси в потоці інтерфейсу користувача. Це найкорисніше, коли ваші програми керуються даними або керуються веб-api або використовують складні інтерфейси, такі як побудовані за допомогою Canvas. Сила AsyncTask полягає в тому, що дозволяє робити речі у фоновому режимі, і як тільки ви закінчите обробку, ви можете просто виконати необхідні дії на інтерфейсі користувача, не викликаючи ефекту відставання. Це можливо, тому що AsyncTask походить від потоку інтерфейсу діяльності Activity - всі операції, які ви робите над користувальницьким інтерфейсом через AsyncTask, - це інший потік від основного потоку інтерфейсу, без перешкод у взаємодії з користувачем.
Тож це те, що потрібно знати для створення плавних програм для Android, і наскільки я знаю, кожен новачок отримує це повідомлення на консолі.