Fortschrittsanzeige UI Einfriert / Langsam

9

Ich habe einen Fortschrittsdialog, den ich für einen Teil in meinem Programm verwende, wo ich eine zeitintensive Operation im Hintergrund ausführe, aber wenn der Dialog angezeigt wird, friert das UI- oder Spinner-Symbol ein / langsam / zögert das Programm so, als ob es erscheint erstarrte. In meinem onPostExecute von meinem AsyncTask verlasse ich den Dialog.

Warum passiert das, weil ich die ganze Arbeit im Hintergrund mache?

hier ist mein Code

%Vor%

UPDATE: den Code im Debug-Modus letzte Nacht durchlaufen scheint es zu tun, es in der for-Schleife zu tun, aber immer noch das alles in einem separaten Thread getan wird und ich nur Werte in meine Datenbank einfügen

UPDATE 2 Wenn ich die for-Schleife auskommentiere, wird der Fortschrittsdialog für weniger als eine Sekunde angezeigt. Obwohl ich alles in AsyncTask mache, müssen die Einfügungen immer noch im UI-Thread ausgeführt werden

    
tyczj 11.08.2012, 15:55
quelle

5 Antworten

2

Ich habe herausgefunden, dass ich eine unkontrollierbare Methode auf dem UI-Thread hatte, die ich nicht bemerkt habe

    
tyczj 17.08.2012, 02:53
quelle
1

Dies passiert wahrscheinlich, weil Ihr Hintergrund-Thread 100% der Geräte-CPU verbraucht. Wenn die CPU mit der Verarbeitung eines Threads beschäftigt ist, wird der UI-Thread nicht aktualisiert und Sie sehen ihn daher als eingefroren an

Versuchen Sie herauszufinden, was am aggressivsten ist, indem Sie Code aus Ihrem doInBackground entfernen und die App erneut ausführen. Versuchen Sie auch zu sehen, wie es funktioniert, wenn das Gerät nicht über USB angeschlossen ist - das bringt manchmal seltsame Ergebnisse

    
Anton 16.08.2012 12:12
quelle
0

Sie verwenden ProgressDialog falsch.

Sie müssen eine onPreExecute Methode hinzufügen, und dort definieren und zeigen Sie Ihre ProgressDialog . Dann wird doInBackground in einem anderen Thread ausgeführt und schließlich in onPostExecute den Dialog geschlossen.

Hier ist ein einfaches Beispiel:

%Vor%

Übrigens empfehle ich Ihnen auch, keine hartcodierten Saiten zu verwenden. Stattdessen können Sie die Datei strings.xml unter res\values\ aufrufen und eine Zeichenfolge definieren. Dann können Sie in Ihrem Code entweder getString(R.string.yourStringId) oder R.string.yourStringId verwenden. Es hängt davon ab, ob die Methode IDs akzeptiert oder nicht (Methoden, die IDs akzeptieren, führen Sie tatsächlich getString mit der ID aus, die Sie gesendet haben).

    
Android Joker 14.08.2012 14:29
quelle
0

Ich sehe keinen Fehler in Ihrem Code, aber Sie müssen verstehen, dass das Schreiben von Code in einem anderen Thread nicht bedeutet, dass es einen anderen Prozessor bekommt. Wenn Ihr Gerät einen Single-Core-Prozessor hat, arbeitet es zeitaufwendig und arbeitet im Round-Robin-Modus. Wenn Ihr Gerät mehrere Kerne hat, wird es tatsächlich mehrere Threads durchführen. Wenn Sie also einen Single-Core-Prozessor haben, wird Ihnen eine Verzögerung in der Fortschrittsleiste angezeigt.

    
user1503346 16.08.2012 11:53
quelle
0

Ich habe den Dialog so erfolgreich umgesetzt.

%Vor%     
CAM-Dev 16.08.2012 02:56
quelle

Tags und Links