Oto bardziej szczegółowe wyjaśnienie:
Choreographer pozwala aplikacjom łączyć się z vsync i odpowiednio mierzyć czas w celu poprawy wydajności.
Animacje widoku Androida wykorzystują Choreographer do tego samego celu: do prawidłowego synchronizowania animacji i ewentualnej poprawy wydajności.
Ponieważ Choreographer jest informowany o każdym zdarzeniu vsync, mogę stwierdzić, czy jedno z Runnables przekazanych przez Choreographer.post * apis nie kończy się w czasie jednej klatki, powodując pomijanie klatek.
W moim rozumieniu Choreograf może wykryć tylko pomijanie klatek. Nie sposób powiedzieć, dlaczego tak się dzieje.
Komunikat „Aplikacja może wykonywać zbyt wiele pracy w głównym wątku”. może wprowadzać w błąd.
źródło:
Znaczenie komunikatów choreografa w Logcat
Dlaczego powinieneś się martwić?
Gdy ten komunikat wyskakuje na emulatorze Androida, a liczba pomijanych ramek jest dość mała (<100), możesz bezpiecznie założyć, że emulator jest wolny - co zdarza się prawie cały czas. Ale jeśli liczba ramek jest pomijana i duża, a rzędu 300+, mogą wystąpić poważne problemy z kodem. Urządzenia z Androidem są dostępne w szerokiej gamie sprzętu, w przeciwieństwie do urządzeń iOS i Windows. Pamięć RAM i procesor są różne i jeśli chcesz mieć rozsądną wydajność i wrażenia użytkownika na wszystkich urządzeniach, musisz to naprawić. Gdy klatki są pomijane, interfejs użytkownika jest powolny i opóźniony, co nie jest pożądanym doświadczeniem użytkownika.
Jak to naprawić
Naprawienie tego wymaga identyfikacji węzłów, w których istnieje lub może się zdarzyć długi czas przetwarzania. Najlepszym sposobem jest wykonanie całego przetwarzania bez względu na to, jak mały lub duży w wątku oddzielnym od głównego wątku interfejsu użytkownika. Czy to będzie uzyskiwanie dostępu do danych z bazy danych SQLite, wykonywanie trudnych matematyki lub po prostu sortowanie tablicy - zrób to w innym wątku
Teraz jest tu haczyk. Utworzysz nowy wątek do wykonywania tych operacji, a po uruchomieniu aplikacji zawiesi się komunikat „Tylko oryginalny wątek, który utworzył hierarchię widoków, może dotknąć jego widoków”. Musisz wiedzieć, że interfejs użytkownika w Androidzie można zmienić tylko przez główny wątek lub tylko wątek interfejsu użytkownika. Każdy inny wątek, który próbuje to zrobić, zawiesza się i ulega awarii z tym błędem. Co musisz zrobić, to utworzyć nowy Runnable wewnątrz runOnUiThread i wewnątrz tego runnable powinieneś wykonać wszystkie operacje z udziałem interfejsu użytkownika. Znajdź przykład tutaj .
Mamy więc Thread i Runnable do przetwarzania danych z głównego wątku, co jeszcze? W Androidzie jest AsyncTask, który umożliwia wykonywanie długich procesów w wątku interfejsu użytkownika. Jest to najbardziej przydatne, gdy aplikacje są sterowane danymi lub interfejsami WWW lub używają złożonych interfejsów użytkownika, takich jak te budowane przy użyciu Canvas. Moc AsyncTask polega na tym, że pozwala robić rzeczy w tle, a po zakończeniu przetwarzania możesz po prostu wykonać wymagane czynności w interfejsie użytkownika, nie powodując żadnych opóźnień. Jest to możliwe, ponieważ AsyncTask wywodzi się z wątku interfejsu użytkownika działania - wszystkie operacje wykonywane na interfejsie użytkownika za pomocą AsyncTask są inne niż główny wątek interfejsu użytkownika. Brak przeszkód dla interakcji użytkownika.
To jest to, co musisz wiedzieć, aby tworzyć płynne aplikacje na Androida i o ile wiem, każdy początkujący otrzymuje tę wiadomość na swojej konsoli.