TextView in einer Schleife updaten

  • 1 Antworten
  • Letztes Antwortdatum
D

DiaBloB555

Neues Mitglied
0
Hallo liebe Experten,

ich habe gerade mit einem TextView in Java/Android zu kämpfen.

ICh möchte ein Textfeld (TextView) mit einer Zahl füllen und diese inkrementieren und erneut anzeigen lassen, das alles in einer Schleife. In etwa sollte das ganz so aussehen:

Code:
int i = 0;

  while (i <= 100) {

  TextView01.setText(i);
  i++;
  Thread.sleep(100); // pause für 0,1 Sekunde 
  
  }

Eigentlich kenne ich das mit System.out.println(i) von java, da hat alles so geklappt. Ich dachte also es sollte gut klappen, aber praktisch stimmt was nicht. Drücke ich einen Button auf dem Android-Phone, der die Schleife startet passiert folgendes: Der button behält den gedrückten startus bei (ist "eingedrückt" und die farbe bleibt auch gleich) für 10 Sekunden und wenn dann steht im Textfeld nur eine 101, also bekomme ich nicht bei jedem Schleifen-durchlauf eine neue Zahl dargestellt, sonder nur nachem die Schleife komplett durchlaufen wurde. In den 10 Sekunden der Schleifedurchlaufszeit passiert nicht, das Programm ist "eingefroren"


Hat jemand eine Idee ?
 
Ich kann dir sagen warum das so ist.
Da du mit Thread.sleep den gesamten UI-Thread anhälst, kann Android deine Textview nicht neu zeichnen. Wobei das auch ohne sleep nicht funktionieren dürfte, da du weiterhin den UI Thread blockierst.

Was funktionieren könnte wenn du mit AsyncTask hochzählst, den Thread kannst du dann auch anhalten, ohne dass du den UI Thread anhälst.

EDIT:
Versuch's mal so ohne Garantie, dass das irgendwie optimiert wäre oder so ;)
Code:
    @Override
    public void onClick(final View v) {
        AsyncTask task = new AsyncTask() {
            @Override
            protected Object doInBackground(Object... params) {
                int i = 0;

                while (i <= 100) {
                    final int x = i;
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            view.setText(String.valueOf(x));
                        }
                    });
                    i++;
                    try {
                        Thread.sleep(100); // pause für 0,1 Sekunde
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
            }
                return null;
        }
        };
        task.execute(this);
    }
 
Zuletzt bearbeitet:
Zurück
Oben Unten