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 im Emulator mit 3 verschiedenen freien Bibliotheken auszuführen. Auf dem Layoutbildschirm wird nichts angezeigt. Der Logcat wiederholt die folgende Meldung:
W / Trace (1378): Unerwarteter Wert von nativeGetEnabledTags: 0 Ich / Choreograf (1378): 55 Frames übersprungen! Die Anwendung arbeitet möglicherweise zu viel an ihrem Hauptthread.
Das Problem blieb nicht bestehen und das Diagramm funktionierte, als ich einen Beispielcode für eine Evaluierungskopie einer lizenzierten Bibliothek ausführte.
android
multithreading
user2038135
quelle
quelle
Antworten:
entnommen aus: Android UI: Übersprungene Frames korrigieren
Dies bedeutet, dass die Verarbeitung Ihres Codes lange dauert und Frames deswegen übersprungen werden. Dies liegt möglicherweise an einer umfangreichen Verarbeitung, die Sie im Herzen Ihrer Anwendung oder am DB-Zugriff ausführen, oder an anderen Dingen, die den Thread dazu veranlassen hör für eine Weile auf.
quelle
Wie andere oben antworteten: "55 Frames übersprungen!" bedeutet, dass sich in Ihrer Anwendung eine schwere Verarbeitung befindet.
Für meinen Fall gibt es keinen schweren Prozess in meiner Bewerbung. Ich habe alles doppelt und dreifach überprüft und den Prozess entfernt, den ich für etwas schwer halte.
Ich entfernte Fragmente, Aktivitäten, Bibliotheken, bis nur noch das Skelett übrig war. Trotzdem verschwand das Problem nicht. Ich habe beschlossen, die Ressourcen zu überprüfen, und festgestellt, dass einige der von mir verwendeten Symbole und Hintergründe ziemlich groß sind, da ich vergessen habe, die Größe dieser Ressourcen zu überprüfen.
Mein Vorschlag ist also, wenn keine der oben genannten Antworten hilft, können Sie auch die Größe Ihrer Ressourcendateien überprüfen.
quelle
Ich hatte auch das gleiche Problem.
Meins 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 Begrüßungsbildschirms und der Startseite in meiner Android-App verwendet.
Lösung - Ich habe gerade dieses bestimmte Bild von drawables in den Ordner drawables-xxx verschoben und konnte viel Speicherplatz im Hintergrund freigeben, und die überspringenden Frames wurden nicht mehr übersprungen.
Update Verwenden Sie den zeichnbaren Ressourcenordner 'nodp' zum Speichern von Drawables-Hintergrunddateien.
Wird ein dichtequalifizierter Zeichenordner oder ein Zeichen-Nodpi Vorrang haben?
quelle
drawable-xxxhdpi
stattdessen Ordner,drawable
was den verwendeten Speicher drastisch reduziert (~ 70 Prozent weniger). Gut zu wissen, dass Bildschirme mit derselben Größe in der DPI-Größe variieren. Das Verhältnis in Pixeln zwischen ihnen istldpi = 1:0.75
,mdpi = 1:1
,hdpi = 1:1.5
,xhdpi = 1:2
,xxhdpi = 1:3
,xxxhdpi = 1:4
. Wenndrawable-xxxhdpi
Sie den Ordner verwenden, können Sie die Bilder auf die Bildschirmgröße Ihres Geräts verkleinern, was den Speicher- und CPU-Verbrauch verringert.drawable
nach wirddrawable-nodpi
verhindert , dass die Anwendung abgerufen wirdOut of Memory Error
.Eine weitere häufige Ursache für Verzögerungen im UI-Thread ist der Zugriff auf SharedPreferences. Wenn Sie
PreferenceManager.getSharedPreferences
zum ersten Mal eine und ähnliche Methoden aufrufen , wird die zugehörige XML-Datei sofort geladen und im selben Thread analysiert .Eine gute Möglichkeit, dieses Problem zu bekämpfen, besteht darin, das erste Laden von SharedPreference aus dem Hintergrundthread auszulösen, der so früh wie möglich gestartet wird (z. B. aus
onCreate
Ihrer Anwendungsklasse). Auf diese Weise wird das Voreinstellungsobjekt möglicherweise bereits zu dem Zeitpunkt erstellt, zu dem Sie es verwenden möchten.Leider ist manchmal das Lesen von Einstellungsdateien in frühen Startphasen erforderlich (z. B. in der ersten Aktivität oder sogar in der Anwendung selbst). In solchen Fällen ist es immer noch möglich, das Blockieren der Benutzeroberfläche durch Verwendung zu vermeiden
MessageQueue.IdleHandler
. Führen Sie alle anderen Schritte aus, die Sie für den Hauptthread ausführen müssen, und installieren Sie dann den IdleHandler, um Code auszuführen, sobald Ihre Aktivität vollständig gezeichnet wurde. In diesem Runnable sollten Sie auf SharedPreferences zugreifen können, ohne zu viele Zeichenvorgänge zu verzögern und Choreographer unglücklich zu machen.quelle
Versuchen Sie, die folgenden Strategien zu verwenden, um die Leistung Ihrer App zu verbessern:
quelle
Ich hatte das gleiche Problem. Android Emulator funktionierte perfekt unter Android <6.0. Als ich den Emulator Nexus 5 (Android 6.0) verwendete, arbeitete die App sehr langsam mit
I/Choreographer: Skipped frames
in den Protokollen .Also habe ich dieses Problem gelöst, indem ich die
hardwareAccelerated
Option " Manifest-Datei" so geändert habe , dass sie mirtrue
gefällt:quelle
Ich bin kein Experte, aber ich habe diese Debug-Meldung erhalten, als ich Daten von meiner Android-Anwendung an einen Webserver senden wollte. Obwohl ich die AsyncTask-Klasse verwendet und die Datenübertragung im Hintergrund durchgeführt habe, habe ich zum Abrufen der Ergebnisdaten vom Server die get () -Methode der AsyncTask-Klasse verwendet, die die Benutzeroberfläche synchronisiert, was bedeutet, dass Ihre Benutzeroberfläche zu lange wartet. Mein Rat ist daher, dass Ihre App alle netzwerkorientierten Aufgaben in einem separaten Thread ausführt.
quelle
Optimieren Sie Ihre Bilder ... Verwenden Sie keine Bilder mit mehr als 100 KB ... Das Laden von Bildern beansprucht zu viel CPU und führt dazu, dass Ihre App hängt.
quelle
Ich hatte das gleiche Problem. In meinem Fall hatte ich 2 verschachtelte relative Layouts. RelativeLayout muss immer zwei Messdurchgänge ausführen. Wenn Sie RelativeLayouts verschachteln, erhalten Sie einen exponentiellen Messalgorithmus.
quelle
Dies geschieht normalerweise, wenn Sie große Prozesse im Hauptthread ausführen. Es ist in Ordnung, Frames mit weniger als 200 Frames zu überspringen. Wenn Sie jedoch mehr als 200 übersprungene Frames haben, kann dies den Anwendungs-UI-Thread verlangsamen. Was Sie tun können, ist, diese Prozesse in einem neuen Thread namens Worker-Thread auszuführen. Wenn Sie danach auf UI-Thread zugreifen und etwas mit ihm tun möchten (z. B. etwas mit Ansichten, findView usw. tun), können Sie Handler oder runOnUiThread verwenden (Ich mag das mehr), um die Verarbeitungsergebnisse anzuzeigen. Dies löst das Problem absolut. Die Verwendung von Worker-Threads ist sehr nützlich oder muss in diesen Fällen sogar verwendet werden.
quelle
Ich hatte das gleiche Problem. Als ich den Code auf einem anderen Computer ausführte, funktionierte er einwandfrei. Bei mir wurde jedoch "Die Anwendung arbeitet möglicherweise zu viel an ihrem Hauptthread" angezeigt.
Ich habe mein Problem durch einen Neustart von Android Studio gelöst [Datei -> Ungültige Caches / Neustart -> Klicken Sie auf "Ungültig machen und neu starten"].
quelle
In meinem Fall lag es daran, dass ich versehentlich einen Haltepunkt für eine Methode festgelegt hatte. Nachdem ich es gelöscht hatte, verschwand die Nachricht und die Leistung verbesserte sich erheblich.
quelle
Meine App hatte das gleiche Problem. Aber es wurde nichts anderes getan, als eine Liste mit Karten und Text darauf anzuzeigen. Nichts läuft im Hintergrund. Aber nach einigen Nachforschungen stellte sich heraus, dass das für den Kartenhintergrund festgelegte Bild dies verursachte, obwohl es klein war (350 KB). Dann habe ich das Bild mit http://romannurik.github.io/AndroidAssetStudio/index.html in 9patch-Bilder konvertiert .
Das hat bei mir funktioniert.
quelle
Nachdem ich viel Forschung und Entwicklung zu diesem Thema betrieben 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 vorhanden ist, aber überhaupt nicht. Das nächste Problem, das ich gefunden habe, ist, dass ich in der May-App ein großes Bild verwende, und das ist das Problem.
Ich habe die Bilder entfernt und neue Bilder eingestellt.
Fazit: - Sehen Sie in Ihrem Code nach, ob eine von Ihnen verwendete Rohdatei groß ist.
quelle
Lesen Sie zuerst die Warnung. Es heißt mehr Belastung des Hauptfadens. Sie müssen also nur Funktionen mit mehr Arbeit in einem Thread ausführen.
quelle
Ich habe das gleiche Problem bei der Entwicklung einer App, die viele zeichnbare PNG-Dateien im Rasterlayout verwendet. Ich habe auch versucht, meinen Code so weit wie möglich zu optimieren. Aber es hat bei mir nicht geklappt. Dann habe ich versucht, die Größe dieser PNG zu reduzieren. Und ich denke, es funktioniert absolut einwandfrei. Mein Vorschlag ist also, sie zu reduzieren Größe der ziehbaren Ressourcen, falls vorhanden.
quelle