Problem beim Programieren eines Timers...

  • Antworten:2
  • Bentwortet
Ford Prefect
  • Forum-Beiträge: 29

12.05.2017, 19:40:46 via Website

Hey,
ich habe ein Problem:
Ich schreibe eine app, in der ein Timer ablaufen soll, und eine Progressbar diesen darstellen soll:

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.game_activity);

    gameImages.setOnClickListener(GameActivity.this);

    newRound();

    Log.i("GameActivity.onCreate", "GameActivity has started");
}
public void timeCounter(){
    while (!finished && time > 0){
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                time--;
                Log.i("GameActivity", "Time -1 : "+Integer.toString(time));
                progressBarTime.setProgress(time);
            }
        }, 1000);
    }
}
public void newRound(){
    counter = 0;
    time = 30;
    progressBarTime.setMax(timeMax);
    round = round +1;
    Log.i("GameActivitynewRound", "Round = "+Integer.toString(round));
    progressBarPunches.setMax(round*43);
    gameImages.setImageResource(R.drawable.picture1);
    finished = false;
    timeCounter();
   }
   public void onClick(View v) {


    if (!finished){
        counter++;
    }
    playSound();
    progressBarPunches.setProgress(counter);
    progressBarTime.setProgress(time);
    actualizeScreen();
}

`public void roundEnd(){
progressBarPunches.setProgress(0);
gameImages.setImageResource(R.drawable.nazi43);
finished = true;
timeDelayedNewRound(3000);

}

`

Ich hab jetzt das ganze rutergekürzt um es überschaubarer zu halten.
Mein Problem ist, sobald timCounter() in newRound ausgeführt wird, wird mein Bildschirm Schwarz und nichts geht mehr. In den Logfiles wird Log.i("GameActivity", "Time -1 : "+Integer.toString(time)); auch nicht ausgegeben.
Ich hab ehrlich gesagt viel zu wenig Erfahrung um zu checken wieso.
ich hoffe mein Code reicht aus , damit ihr euch ien Bild machen könnt.
Kann mir jemand dabei helfen?
MfG,
Ford.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

13.05.2017, 09:26:20 via Website

Hallo Ford,
so wie du das bisher hast, geht das nicht. Du musst das ganze mit Rekursion statt eine while Schleife machen.

Bisher wird die while ganz oft hintereinander ausgeführt und startet haufenweise delayedRunnables.

Da du aber den Timer ja nur alle Sekunde herunterzäglen willst, musst du das erneute Starten auch im Timer Rnnable machen.

Etwa so:
public void timeCounter(){

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            time--;
            Log.i("GameActivity", "Time -1 : "+Integer.toString(time));
            progressBarTime.setProgress(time);
              if(!finished && time > 0)timeCounter(); //Bei geltender Bedingung sich selbst aufrufen, da Rekursion.
        }
    }, 1000);

}

LG Pascal //It's not a bug, it's a feature. :) ;)

Ford Prefect

Antworten
Ford Prefect
  • Forum-Beiträge: 29

13.05.2017, 12:35:50 via Website

Das hat funktioniert.
Vielen Dank! :)

Antworten