Wie wird ein TextView während der Schleife in Android aktualisiert?

7

Ich habe das:

%Vor%

Ich würde erwarten, dass es die Textansicht jedes Mal durch die Schleife aktualisiert, damit ich Folgendes bekomme: 1, 2, 3, ... 99

Stattdessen macht die App 10 Sekunden lang nichts und gibt dann: 99

aus

Ich vermute, dass ich die TextView während der Schleife aktualisieren muss. Ich bin neu in der Android-Entwicklung. Kann mir bitte jemand sagen, ob dies der beste Weg ist, dies zu erreichen?

Mein Ziel ist es schließlich, Audio-Samples zu verarbeiten, um einen Gitarrentuner zu bauen. Ich versuche einfach visuell zu überprüfen, dass die App auf externe Audiodaten reagiert, und ich möchte eine TextView aktualisieren, um dies zu demonstrieren. Bitte geben Sie an, ob es einen besseren Weg gibt, dies zu tun.

    
chaimp 13.12.2010, 03:46
quelle

4 Antworten

6

Ihr Problem besteht darin, dass Sie Ihre Schleife in onCreate () ausführen. Dies geschieht auf dem Benutzeroberflächenthread, bevor Ihre Aktivität angezeigt wird.

Sehen Sie sich den Aktivitätslebenszyklus in Android an. Es zeigt onCreate ist nur eine der Phasen in der Aktivitätserstellung. Was Sie tun möchten, ist die Schleife in einem Hintergrund-Thread auszuführen und die Benachrichtigung zu posten, um TextView mit runOnUiThread im UI-Thread zu aktualisieren. Christians Antwort zeigt, wie man das macht.

Da Ihr Ziel letztendlich darin besteht, das TextView auf der Grundlage einiger Benutzereingaben zu aktualisieren (in Ihrem Fall Audio), müssen Sie nicht durch alle diese Schleifen springen, um es zu funktionieren. Die einzige wichtige Sache ist, dass Sie Ihre Aufrufe posten, um die Benutzeroberfläche im Benutzeroberflächenthread zu aktualisieren, andernfalls erhalten Sie Ausnahmen.

    
pheelicks 13.12.2010, 04:05
quelle
22

Ich hatte das gleiche Problem und habe es mit einem Handler gelöst:

%Vor%

Mit mHandler.post(mUpdate) rufen Sie mUpdate auf, das ein Runnable ist, das in einem anderen Thread ausgeführt wird, der die Benutzeroberfläche aktualisieren kann. Innerhalb der Methode run() , anstatt eine for-Schleife zu erstellen, die das gleiche Problem hat wie Sie, setzen Sie den gewünschten Text mit einer Hilfsvariablen, inkrementieren Sie ihn und rufen Sie mHandler.postDelayed(this,updateTime) auf. In diesem Moment wird die Ansicht aktualisiert und Sie haben Ihren Text auf dem Bildschirm. Nach der von Ihnen angegebenen Zeit (in Millisekunden) wird das Runnable mUpdate erneut aufgerufen und der Text mit der nächsten Nummer usw. festgelegt an.

Ich hoffe, es hilft.

    
Racker 14.03.2011 17:41
quelle
8

Sie verwenden besser einen Timer:

%Vor%

Beachten Sie, dass ich runOnUiThread verwende, da Sie eine Ansicht von einem anderen Thread, der nicht der Hauptthread ist, nicht ändern können.

    
Cristian 13.12.2010 03:56
quelle
1

Anstatt Handler zu verwenden, ist es möglich, Runnable direkt an post mit Delay zu übergeben:

%Vor%     
shtolik 13.07.2017 11:06
quelle

Tags und Links