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
ausIch 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.
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.
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.