2016-04-20 7 views
0

Ich habe in letzter Zeit versucht, einen Timer in meine App hinzuzufügen. Ich habe einen Handler und die Public-Run-Methode verwendet, um das zu tun. Bis jetzt habe ich es nur geschafft, den Timer für eine Sekunde laufen zu lassen. Ich habe versucht, eine While-Schleife zu verwenden, aber egal, wo ich sie hinlegte, die App stürzte ab, sobald ich den Timer startete. Ich würde mich freuen, wenn mir jemand ein Beispiel für die Verwendung einer Schleife in dieser Situation geben könnte, so dass der Timer so lange läuft, wie ich es möchte.Hinweise zum Einwickeln eines Handlers mit einer Schleife

Hier ist mein Code:

if (v == btnStart) { 
      Toast.makeText(ScoreBoardActivity.this, "The game has started. ENJOY!", Toast.LENGTH_LONG).show(); 
      btnStart.setText("STOP GAME"); 
      int playTime = (getIntent().getExtras().getInt("gameTime"))/10; 
      Handler handler = new Handler(); 
       handler.postDelayed(new Runnable() { 
        public void run() { 
         int playTime = (getIntent().getExtras().getInt("gameTime"))/10; 
         if (sec1 < 9) { 
          sec1 = sec1 + 1; 
          tvSec1.setText(String.valueOf(sec1)); 
          tvSec10.setText(String.valueOf(sec10)); 
          tvMin10.setText(String.valueOf(min10)); 
          tvMin1.setText(String.valueOf(min1)); 
         } else if (sec1 == 9 && sec10 < 5) { 
          sec1 = 0; 
          sec10 = sec10 + 1; 
          tvSec1.setText(String.valueOf(sec1)); 
          tvSec10.setText(String.valueOf(sec10)); 
          tvMin10.setText(String.valueOf(min10)); 
          tvMin1.setText(String.valueOf(min1)); 
         } else if (sec1 == 9 && sec10 == 5 && min1 < 9) { 
          sec1 = 0; 
          sec10 = 0; 
          min1 = min1 + 1; 
          tvSec1.setText(String.valueOf(sec1)); 
          tvSec10.setText(String.valueOf(sec10)); 
          tvMin10.setText(String.valueOf(min10)); 
          tvMin1.setText(String.valueOf(min1)); 
         } else if (sec1 == 9 && sec10 == 5 && min1 == 9 && min10 < playTime) { 
          sec1 = 0; 
          sec10 = 0; 
          min1 = 0; 
          min10 = min10 + 1; 
          tvSec1.setText(String.valueOf(sec1)); 
          tvSec10.setText(String.valueOf(sec10)); 
          tvMin10.setText(String.valueOf(min10)); 
          tvMin1.setText(String.valueOf(min1)); 
         } 
        } 
       }, 1000); 
      } 
+0

Fehler anzeigen. Sind Sie sicher, dass Sie Argumente mit Ihrer Absicht bekommen? Was ist sec1, sec10, min1, min10? – Apurva

Antwort

0

Sie PostDelayed(handler, 1000) in jedem Run nennen sollte() aufrufen, einen weiteren Lauf nach 1 Sekunde planen:

final Handler handler = new Handler(); 
Runnable myRunnable = new Runnable() { 
    public void run() { 
     ... 
     handler.PostDelayed(this, 1000); 
    } 
} 
handler.PostDelayed(myRunnable, 1000); 

Sie können nicht während Schleifen und schläft verwenden Inside-Handler, da dies einen UI-Thread blockieren würde, wodurch Ihre App nicht mehr reagiert und schließlich abstürzt.

+0

und wenn es genau sein muss, ist es besser, 'postAtTime' oder' postDelayed' mit einem "mehr oder weniger 1000ms" zu verwenden. – pskink

+0

Kannst du den Weg zeigen, es mit dem Code zu machen, den ich geschrieben habe? Weil es aus irgendeinem Grund nicht für mich funktioniert. –

+0

Ersetzen Sie das '...' durch den Code Ihrer run() -Methode. vergewissere dich, dass der Handler endgültig ist (siehe meine Bearbeitung). Und wenn etwas immer noch nicht für Sie funktioniert, melden Sie Fehler. Wenn die Leute raten müssen, was falsch ist, werden Sie wahrscheinlich keine Antworten bekommen. –