Android - Zeitleiste - 10 Sekunden Rhythmus
lima-city → Forum → Programmiersprachen → Java
anwendung
art
balken
code
display
grund
jemand
kontrolle
messen
netten nebeneffekt
passen
post
run
sekunde
spiel
start
text
update
verraten
vorschlag
-
Hallo zusammen,
ich habe eine Art Spiel, bei dem man 10 Sekunden pro Runde Zeit hat, um etwas zu machen. Nach den 10 Sekunden startet direkt eine neue Runde. Während einer Runde füllt sich eine ProgressBar, so dass sie nach den 10 Sekunden voll ist. Dazu habe ich mir folgendes zusammen gebastelt:
public void starteRunde() { progressStatus = 0; // hier passiert was new Thread(new Runnable() { public void run() { while (progressStatus < 100) { progressStatus += 1; // Update the progress bar and display the // current value in the text view pbHandler.post(new Runnable() { public void run() { pbTimeline.setProgress(progressStatus); } }); try { // Sleep for 100 milliseconds. Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); Handler handler = new Handler(); Runnable runnable = new Runnable() { @Override public void run() { if(rundenNr++ < 9){ starteRunde(); } } }; handler.postDelayed(runnable, 10000); }
Wie gesagt, ist nur zusammen gebastelt und vermutlich nicht sehr gut umgesetzt^^ Wer eine bessere Lösung kennt darf sie mir gerne verraten :)
Auf jeden Fall ist es jetzt so, dass die erste Runde normal läuft. In der zweiten Runde füllt sich die ProgressBar schon in 5 Sekunden und nach weiteren 5 Sekunden geht die neue Runde los. In der füllt sich die ProgressBar wieder normal in 10 Sekunden usw. Also jede zweite Runde füllt sich der Balken in 5 Sekunden. Und ich verstehe nicht warum. Weiß jemand woran das liegen könnte? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Threads sind da immer etwas tückisch. Überleg mal was passiert, wenn der Thread für die Progressbar aus irgendeinem Grund ein bisschen länger als die 10sek braucht, in starteRunde "progressStatus" aber schon wieder auf 0 gesetzt wurde.
Mein Vorschlag wäre etwas in der Art, so hast Du mehr Kontrolle darüber, dass alles in der richtigen Reihenfolge abläuft:
public void starteRunde() { progressStatus = 0; // Hier passiert was Runnable progress = new Runnable() { public void run() { pbTimeline.setProgress(++progressStatus % 101); if (progressStatus == 101) { starteRunde(); } else { pbHandler.postDelayed(this, 100); } } }; if (rundenNr++ < 10) { pbHandler.post(progress); } }
Hat den netten Nebeneffekt, dass es auch wesentlich kürzer ist. Allerdings ungetestet!
Wenn Du ganz genau 10 Sekunden haben willst, müsstest Du allerdings die Zeit messen, da ja durch die Methodenaufrufe auch Zeit vergeht etc. Aber ich denke für deine Anwendung sollte das erst mal passen. Ist ja bei deiner Lösung auch nicht anders.
Beitrag zuletzt geändert: 18.5.2015 0:05:43 von davidlw -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage