TextView in einer Schleife updaten

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:

Ähnliche Themen

J
  • Juleru
Antworten
8
Aufrufe
494
Juleru
J
D
  • Data2006
Antworten
14
Aufrufe
483
jogimuc
J
OnkelLon
Antworten
13
Aufrufe
1.973
OnkelLon
OnkelLon
Zurück
Oben Unten