Mit Threads die Oberfläche ändern

  • Antworten:10
Alan M.
  • Forum-Beiträge: 6

09.08.2012, 01:37:28 via Website

Hallo,
ich versuche nun seit ein paar Tagen mit Android-Programmierung zu beschäftigen und komme jetzt an einer Stelle nicht weiter.
Ich will einen Countdown haben der z.B. von 20 bis 0 runterzählt. Während dieser Zeit soll es möglich sein die GUI weiterhin zu bedienen.
Ich hab den Countdown in einem normalen Thread programmiert und hab das Problem sofort erkannt. Laut der Android API soll die Methode runOnUiThread für so etwas anwendbar sein aber solange ich eine Activity verwende bringt es nicht. Kann mir bitte jemand einen Tipp geben?
Ich wäre für eure Hilfe sehr dankbar

Liebe Grüße Alan

— geändert am 09.08.2012, 01:39:22

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

09.08.2012, 08:21:46 via Website

Alan M.
Laut der Android API soll die Methode runOnUiThread für so etwas anwendbar sein aber solange ich eine Activity verwende bringt es nicht.
Die ist genau für sowas da und bringt es auch, wenn man eine Activity benutzt ^^
Es gibt für sowas allerdings elegantere Lösungen.
Wie ist denn dein Code?

Antworten
Alan M.
  • Forum-Beiträge: 6

09.08.2012, 15:42:04 via Website

Hallo Rafael,
das ist hier ist mein Code:
1runOnUiThread(new Runnable() {
2........@Override
3........public void run() {
4................for(int i=20;i>0;i--){
5........................etTime.setText(i+"");
6........................try {
7..............................Thread.sleep(1000);
8........................} catch (InterruptedException e) {
9..............................e.printStackTrace();
10........................}
11................}
12.......}
13});

Es wird aber nicht klappen, da ich irgendwie die ganze Activity pausiere.
Wie ist dein Vorschlag bzw. deine elegantere Lösung?

— geändert am 09.08.2012, 15:45:59

Antworten
André
  • Forum-Beiträge: 77

09.08.2012, 15:45:02 via Website

Mit Thread.sleep(1000); in runOnUiThread() legst du deinen UI thread schlafen, damit kann deine App nicht mehr reagieren.

Du kannst das entweder in einem anderen Thread machen, und dann nur zum Update immer runOnUiThread() nutzen, oder (eleganter) du benutzt einen Timer.

Rafael K.

Antworten
Alan M.
  • Forum-Beiträge: 6

09.08.2012, 15:51:50 via Website

Kannst du mir bitte sagen wie man den Timer verwendet??

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

09.08.2012, 15:52:50 via Website

Andre hats schon alles gesagt.
Ich würde mir an deiner Stelle ein bisschen was dazu durchlesen wie die Aktualisierung der Oberfläche in Android funktioniert, damit du verstehst was da genau in die Hose geht.
Die Sache mit dem uiThread ist ja z.B. in Swing auch so.

— geändert am 09.08.2012, 15:53:15

Antworten
Alan M.
  • Forum-Beiträge: 6

09.08.2012, 16:03:14 via Website

@Rafael
Das mit dem Swing hab ich eigentlich drauf. Ich bin gerade dabei ein Buch zu lesen danke :)

Ich hab das jetzt (glaub ich) so gemacht wie @Andre meint aber mein Schleifenzähler i muss final sein.

1new Thread() {
2 @Override
3 public void run() {
4 for (int i = 20; i > 0; i--) {
5 runOnUiThread(new Runnable() {
6 @Override
7 public void run() {
8 etTime.setText(i + "s");
9 }
10 });
11 try {
12 Thread.sleep(1000);
13 } catch (InterruptedException e) {
14 // TODO Auto-generated catch block
15 e.printStackTrace();
16 }
17 }
18 }
19 }.start();

— geändert am 09.08.2012, 16:03:41

Antworten
Alan M.
  • Forum-Beiträge: 6

09.08.2012, 16:23:12 via Website

OK danke euch beiden. Jetzt weiß ich wenigstens womit ich mich beschäftigen muss.
Viele Grüße
Alan

Antworten
Alan M.
  • Forum-Beiträge: 6

10.08.2012, 15:32:03 via Website

Nein leider nicht. Ich hab es per Hand geschrieben

Antworten