Hier ist eine detailliertere Erklärung:
Mit Choreographer können sich Apps mit dem vsync verbinden und die Zeit richtig einstellen, um die Leistung zu verbessern.
Animationen in der Android-Ansicht verwenden Choreographer intern für denselben Zweck: um die Animationen richtig zu steuern und möglicherweise die Leistung zu verbessern.
Da Choreographer über alle vsync-Ereignisse informiert wird, kann ich feststellen, ob eine der vom Choreographer.post * apis weitergegebenen Runnables nicht in der Zeit eines Frames beendet wird und Frames übersprungen werden.
Nach meinem Verständnis kann Choreographer nur das Überspringen von Frames erkennen. Es ist nicht abzusehen, warum dies geschieht.
Die Meldung "Die Anwendung arbeitet möglicherweise zu viel an ihrem Hauptthread." könnte irreführend sein.
Quelle:
Bedeutung der Choreographer-Nachrichten in Logcat
Warum sollten Sie besorgt sein
Wenn diese Meldung auf dem Android-Emulator angezeigt wird und die Anzahl der übersprungenen Frames relativ gering ist (<100), können Sie sicher sein, dass der Emulator langsam ist - was fast immer der Fall ist. Wenn jedoch die Anzahl der Frames übersprungen und groß ist und in der Größenordnung von 300+ liegt, kann es zu ernsthaften Problemen mit Ihrem Code kommen. Android-Geräte sind im Gegensatz zu iOS- und Windows-Geräten mit einer Vielzahl von Hardware ausgestattet. Der Arbeitsspeicher und die CPU variieren. Wenn Sie auf allen Geräten eine angemessene Leistung und Benutzererfahrung erzielen möchten, müssen Sie dieses Problem beheben. Wenn Frames übersprungen werden, ist die Benutzeroberfläche langsam und verzögert, was keine wünschenswerte Benutzererfahrung ist.
Wie man es repariert
Um dies zu beheben, müssen Knoten identifiziert werden, bei denen eine lange Verarbeitungsdauer vorliegt oder möglicherweise auftreten kann. Der beste Weg ist, die gesamte Verarbeitung durchzuführen, egal wie klein oder groß ein Thread ist, der vom Haupt-UI-Thread getrennt ist. Sei es der Zugriff auf Daten aus der SQLite-Datenbank oder das Ausführen von Hardcore-Berechnungen oder das einfache Sortieren eines Arrays - Führen Sie dies in einem anderen Thread durch
Jetzt gibt es hier einen Haken: Sie erstellen einen neuen Thread für diese Vorgänge. Wenn Sie Ihre Anwendung ausführen, stürzt dieser ab und sagt: "Nur der ursprüngliche Thread, der eine Ansichtshierarchie erstellt hat, kann seine Ansichten berühren." Sie müssen diese Tatsache kennen, dass die Benutzeroberfläche in Android nur vom Hauptthread oder vom UI-Thread geändert werden kann. Jeder andere Thread, der dies versucht, schlägt fehl und stürzt mit diesem Fehler ab. Sie müssen lediglich eine neue ausführbare Datei in runOnUiThread erstellen und in dieser ausführbaren Datei alle Vorgänge ausführen, die die Benutzeroberfläche betreffen. Finden Sie ein Beispiel hier .
Wir haben also Thread und Runnable für die Verarbeitung von Daten aus dem Haupt-Thread. Was noch? Es gibt AsyncTask in Android, das es ermöglicht, Langzeitprozesse auf dem UI-Thread durchzuführen. Dies ist am nützlichsten, wenn Ihre Anwendungen daten- oder web-API-gesteuert sind oder komplexe Benutzeroberflächen verwenden, wie sie mit Canvas erstellt wurden. Die Stärke von AsyncTask besteht darin, dass Sie Dinge im Hintergrund erledigen können. Sobald Sie mit der Verarbeitung fertig sind, können Sie einfach die erforderlichen Aktionen auf der Benutzeroberfläche ausführen, ohne Verzögerungseffekte zu verursachen. Dies ist möglich, weil sich die AsyncTask vom UI-Thread der Aktivität ableitet. Alle Vorgänge, die Sie über AsyncTask auf der UI ausführen, sind andere Threads als der Haupt-UI-Thread. Keine Behinderung der Benutzerinteraktion.
Das ist es also, was Sie wissen müssen, um reibungslose Android-Anwendungen zu erstellen. Soweit ich weiß, erhält jeder Anfänger diese Nachricht auf seiner Konsole.