wake-up-neo.net

Die Anwendung führt möglicherweise zu viel Arbeit in ihrem Haupt-Thread aus

Ich bin neu in der Android SDK/API-Umgebung. Es ist das erste Mal, dass ich versuche, eine Handlung/ein Diagramm zu zeichnen. Ich habe versucht, verschiedene Arten von Beispielcodes auszuführen, wobei der Emulator 3 verschiedene freie Bibliotheken verwendete. Im Layout-Bildschirm wird nichts angezeigt. Das Logcat wiederholt die folgende Meldung:

 W/Trace (1378): Unerwarteter Wert von nativeGetEnabledTags: 0 
 Ich/Choreograph (1378): 55 Frames übersprungen! Die Anwendung führt möglicherweise zu viel Arbeit in ihrem Haupt-Thread aus. 

Das Problem bestand nicht und das Diagramm funktionierte nicht, als ich einen Beispielcode ausführte, der sich auf eine Evaluierungskopie einer lizenzierten Bibliothek bezieht. 

302
user2038135

entnommen aus: Android UI: Fixierte übersprungene Bilder

Jeder, der mit der Entwicklung einer Android-Anwendung beginnt, sieht diese Meldung auf logcat “Choreograf (abc): Übersprungene xx-Frames! Die Anwendung kann .__ sein. zu viel Arbeit an seinem Haupt-Thread. ” Also, was macht es eigentlich bedeutet, warum sollten Sie besorgt sein und wie Sie es lösen können.

Dies bedeutet, dass die Verarbeitung von Frames und Frames mit dem Code lange dauert werden aus diesem Grund ausgelassen, vielleicht wegen einiger schwerer Verarbeitung, die Sie im Herzen Ihrer Anwendung oder Datenbank durchführen Zugriff oder eine andere Sache, die dazu führt, dass der Thread für eine Weile angehalten wird . Hier ist eine ausführlichere Erklärung:

Choreographer erlaubt Apps, sich mit dem vsync zu verbinden, und Zeit, um die Leistung zu verbessern.

Android-Ansichtsanimationen verwenden intern Choreographer für dasselbe Zweck: Die Animationen richtig einplanen und ggf. verbessern Performance.

Da der Choreograph über jedes Vsync-Ereignis informiert wird, kann ich sagen, ob eines der Runner, das der Choreographer.post * apis wird nicht innerhalb eines Frames beendet, wodurch Frames übersprungen werden.

In meinem Verständnis kann der Choreograph nur das Überspringen von Frames erkennen. Es ist unmöglich zu sagen, warum dies geschieht.

Die Meldung „Die Anwendung macht möglicherweise zu viel Arbeit. Thread. ”könnte irreführend sein.

quelle : Bedeutung der Choreographen-Nachrichten in Logcat

Warum sollten Sie besorgt sein

Wenn diese Meldung unter Android angezeigt wird Emulator und die Anzahl der übersprungenen Frames sind ziemlich klein (<100) und dann Sie können davon ausgehen, dass der Emulator langsam ist - was passiert fast immer. Wenn jedoch die Anzahl der Frames übersprungen und groß ist und in der Größenordnung von 300+ kann es mit .__ zu ernsthaften Problemen kommen. dein Code. Android-Geräte sind im Gegensatz zu ios .__ in einer Vielzahl von Hardware enthalten. und Windows-Geräte. RAM und CPU variieren und wenn Sie ein .__ wünschen. vernünftige Leistung und Benutzererfahrung auf allen Geräten als Sie müssen dieses Ding reparieren. Wenn Frames übersprungen werden, ist die Benutzeroberfläche langsam und laggy, was keine wünschenswerte Benutzererfahrung ist.

Wie man es repariert

Um dies zu beheben, müssen Knoten identifiziert werden, an denen oder .__ vorhanden ist. möglicherweise kann eine lange Bearbeitungsdauer auftreten. Am besten tun Sie das Die gesamte Verarbeitung, egal wie klein oder groß, ist in einem Thread getrennt vom Haupt-UI-Thread. Sei es also der Zugriff auf Daten aus SQLite Database oder Hardcore-Berechnungen durchführen oder einfach ein Array sortieren - Machen Sie es in einer anderer Thread

Jetzt gibt es hier einen Haken. Sie erstellen einen neuen Thread für die Ausführung von diese Vorgänge und wenn Sie Ihre Anwendung ausführen, stürzt sie ab "Nur der ursprüngliche Thread, der eine Ansichtshierarchie erstellt hat, kann berühren Sie seine Ansichten “. Sie müssen wissen, dass die Benutzeroberfläche in Android .__ sein kann. nur vom Haupt-Thread oder dem UI-Thread geändert. Jeder andere Thread die versucht, dies zu tun, schlägt fehl und stürzt mit diesem Fehler ab. Was du Dazu müssen Sie eine neue Runable in runOnUiThread und in .__ erstellen. In diesem Fall können Sie alle Operationen ausführen, an denen die Benutzeroberfläche beteiligt ist. Finden ein Beispiel hier .

Wir haben also Thread und Runnable für die Verarbeitung von Daten außerhalb des Hauptthreads was sonst? Es gibt AsyncTask in Android, das es ermöglicht, lange Zeit zu tun Prozesse auf dem UI-Thread. Dies ist am nützlichsten, wenn Sie Anwendungen werden datengesteuert oder über Web-API gesteuert oder verwenden komplexe Benutzeroberflächen wie diese mit Canvas bauen. Die Stärke von AsyncTask ist, dass erlaubt es, Dinge im Hintergrund zu erledigen und wenn Sie fertig sind, machen Sie die Bei der Verarbeitung können Sie einfach die erforderlichen Aktionen für die Benutzeroberfläche ohne .__ ausführen. einen verzögernden Effekt verursachen. Dies ist möglich, weil die AsyncTask leitet sich vom UI-Thread der Aktivität ab - alle von Ihnen ausgeführten Vorgänge auf der Benutzeroberfläche über AsyncTask erfolgt ein anderer Thread als die Hauptbenutzeroberfläche Thread, Keine Behinderung der Benutzerinteraktion.

Dies ist das, was Sie wissen müssen, um ein reibungsloses Android zu erstellen Anwendungen und soweit ich weiß, bekommt jeder Anfänger diese Nachricht auf seinem Konsole.

419
Elenasys

Wie andere oben geantwortet haben, "Übersprungene 55 Bilder!" bedeutet, dass in Ihrer Anwendung einige schwere Verarbeitungsschritte vorhanden sind. 

Für meinen Fall gibt es keinen schweren Prozess in meiner Anwendung. Ich habe alles doppelt und dreifach geprüft und alles entfernt, was ich für etwas schwer hielt. 

Ich entfernte Fragmente, Aktivitäten, Bibliotheken, bis nur noch das Skelett übrig war. Aber immer noch ging das Problem nicht weg. Ich beschloss, die Ressourcen zu überprüfen und fand heraus, dass einige Symbole und Hintergrund, die ich verwende, ziemlich groß sind, als ich vergaß, die Größe dieser Ressourcen zu überprüfen. 

Mein Vorschlag ist, wenn keine der oben genannten Antworten hilft, können Sie auch die Größe Ihrer Ressourcendateien überprüfen.

196
Sithu

Ich hatte auch das gleiche Problem.
Mein Fall war ein Fall, in dem ich ein Hintergrundbild verwendete, das sich in Drawables befand. Dieses bestimmte Bild hatte eine Größe von ca. 130 KB und wurde während des Startbildschirms und der Startseite in meiner Android-App verwendet.

Solution - Ich habe dieses Bild gerade in drawables-xxx von drawables verschoben und konnte viel Speicherplatz im Hintergrund freigeben, und die überspringenden Bilder wurden nicht mehr übersprungen.

Update Verwenden Sie den zeichnerischen Ressourcenordner 'nodp' zum Speichern von Hintergrundobjekten Dateien .
Wird ein von der Dichte qualifizierter, zeichnungsfähiger Ordner oder ein zeichnungsfähiger Knoten Vorrang haben?

55
Prakhar1001

Eine weitere häufige Ursache für Verzögerungen im UI-Thread ist der SharedPreferences-Zugriff. Wenn Sie zum ersten Mal einen PreferenceManager.getSharedPreferences und andere ähnliche Methoden aufrufen, wird die zugehörige XML-Datei sofort geladen und in demselben Thread analysiert.

Eine gute Möglichkeit, dieses Problem zu lösen, ist das Auslösen des ersten SharedPreference-Ladevorgangs aus dem Hintergrund-Thread, der so früh wie möglich gestartet wurde (z. B. aus onCreate Ihrer Application-Klasse). Auf diese Weise kann das Einstellungsobjekt bereits zu dem Zeitpunkt erstellt werden, zu dem Sie es verwenden möchten.

Leider ist es manchmal erforderlich, Präferenzdateien in frühen Startphasen zu lesen (z. B. in der ursprünglichen Aktivität oder sogar in der Anwendung selbst). In solchen Fällen ist es immer noch möglich, das Anhalten der Benutzeroberfläche mithilfe von MessageQueue.IdleHandler zu vermeiden. Machen Sie alles Weitere, was Sie im Haupt-Thread ausführen müssen, und installieren Sie den IdleHandler, um Code auszuführen, sobald Ihre Aktivität vollständig gezeichnet wurde. In diesem Runable sollten Sie in der Lage sein, auf SharedPreferences zuzugreifen, ohne zu viele Zeichenoperationen zu verzögern und Choreographer unglücklich zu machen.

17
user1643723

Verwenden Sie die folgenden Strategien, um die Leistung Ihrer App zu verbessern:

  • Verwenden Sie nach Möglichkeit die Multithreading-Programmierung. Die Leistungsvorteile sind enorm, selbst wenn Ihr Smartphone über einen Kern verfügt (Threads können in verschiedenen Kernen laufen, wenn der Prozessor zwei oder mehr hat). Es ist nützlich, Ihre App-Logik von der Benutzeroberfläche zu trennen. Verwenden Sie Java-Threads, AsyncTask oder IntentService. Überprüfen Sie dies .
  • Lesen und befolgen Sie die verschiedenen Leistungstipps der Android-Entwicklungswebsite. Überprüfe hier .
15
MigDus

Ich bin kein Experte, aber ich habe diese Debug-Nachricht erhalten, als ich Daten von meiner Android-Anwendung an einen Webserver senden wollte. Obwohl ich die AsyncTask-Klasse verwendet habe und die Datenübertragung im Hintergrund durchgeführt habe, habe ich die get () - Methode der AsyncTask-Klasse verwendet, um die Ergebnisdaten vom Server zurückzubekommen. Dadurch wird die Benutzeroberfläche synchron, was bedeutet, dass Ihre Benutzeroberfläche zu lange wartet. Mein Rat ist also, dass Ihre App alle netzwerkorientierten Aufgaben in einem separaten Thread erledigt. 

7
saba

Ich hatte das gleiche Problem. Android Emulator funktionierte perfekt auf Android <6.0. Als ich den Emulator Nexus 5 (Android 6.0) verwendete, funktionierte die App sehr langsam mit I/Choreographer: Skipped frames in den Protokollen.

Also habe ich dieses Problem gelöst, indem ich die Option hardwareAccelerated der Manifest-Datei in true geändert habe:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.example.myapplication">

    <application Android:hardwareAccelerated="true">
        ...
    </application>
</manifest>
6
phen0menon

Ich hatte das gleiche Problem. In meinem Fall hatte ich 2 verschachtelte relative Layouts. RelativeLayout muss immer zwei Taktdurchgänge durchführen. Wenn Sie RelativeLayouts verschachteln, erhalten Sie einen exponentiellen Messalgorithmus.

5
Radoslav

Optimieren Sie Ihre Bilder ... Verwenden Sie keine Bilder, die größer als 100 KB sind.

4
HarshitG

Ich hatte das gleiche Problem. Wenn ich den Code auf einem anderen Computer ausgeführt habe, hat es gut funktioniert. Bei mir wurde jedoch angezeigt "Die Anwendung macht möglicherweise zu viel Arbeit in ihrem Haupt-Thread". 

Ich habe mein Problem durch Neustarten des Android-Studios gelöst [Datei -> Ungültige Caches/Neustart -> klicken Sie auf "Invalidieren und Neustart"].

1
sonida

Lesen Sie zuerst die Warnung. Es sagt mehr Last auf Hauptthread. Sie müssen also nur Funktionen mit mehr Arbeit in einem Thread ausführen. 

0
Credoz

dies geschieht normalerweise, wenn Sie lange Prozesse im Haupt-Thread ausführen. Es ist in Ordnung, Frames unter 200 zu überspringen. Wenn Sie jedoch mehr als 200 Frames übersprungen haben, kann dies die Anwendungsbenutzeroberfläche verlangsamen. Sie können diese Prozesse in einem neuen Thread namens Arbeitsthread ausführen und anschließend das Ergebnis der Kommunikation mit dem Hauptthread anzeigen. In den meisten Fällen können AsyncTask und RunOnUiThread das Problem lösen ...

0
Hossein Karami

Meine App hatte das gleiche Problem. Aber es war nichts anderes als eine Liste von Karten und Text darauf anzuzeigen. Nichts läuft im Hintergrund. Nach einigen Untersuchungen stellte sich jedoch heraus, dass das für den Kartenhintergrund gesetzte Bild dies verursachte, obwohl es klein war (350kb). Dann habe ich das Bild mit http://romannurik.github.io/AndroidAssetStudio/index.html in 9patch-Bilder konvertiert.
Das hat bei mir funktioniert.

0
naamadheya

Nachdem ich viel Forschung und Entwicklung zu diesem Thema unternommen hatte, bekam ich die Lösung.

In meinem Fall verwende ich einen Dienst, der alle 2 Sekunden ausgeführt wird, und mit dem runonUIThread habe ich mich gefragt, ob das Problem dort überhaupt nicht vorhanden war .. Die nächste Ausgabe, die ich gefunden habe, ist, dass ich großes Image in der Mai-App und das ist das Problem.

Ich habe die Bilder entfernt und neue Bilder gesetzt.

Fazit: - Schauen Sie in Ihren Code, dass jede von Ihnen verwendete Rohdatei von großer Größe ist. 

0
Hector Morris