Countdown-Timer mit auto restart

  • Antworten:11
  • OffenNicht stickyNicht beantwortet
Gelöschter Account
  • Forum-Beiträge: 35

20.07.2014, 16:27:07 via Website

Hallo,

Ich habe gestern einen Countdown-Timer erstellt, mit dem man z.B. 3 Minuten runterzählen kann.
Der Timer beginnt wenn man den startbutton drückt. Mein Ziel ist jedoch den Timer eine bestimmte Zeit runterzählen zu lassen und sobald er bei 0 (bzw. 00:00 bzw 00:00:00) angekommen soll eine neue (im code angegebene) Zeit runtergezählt werden.

( Dieser Vorgang soll noch 2 weitere Runden durchgeführt werden---- also z.B. R1(20sek ,10sek) R2(20sek ,10sek)R3( 20sek ,10sek) nach Runde 3 (=R3) ist dann 'stop' bzw. 'Completed.' )

code:

import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import java.util.concurrent.TimeUnit;

@TargetApi(Build.VERSION_CODES.GINGERBREAD)
@SuppressLint("NewApi";)
public class MainActivity extends Activity {
Button btnStart, btnStop;
TextView textViewTime;
@Override

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btnStart = (Button)findViewById(R.id.btnStart);
    btnStop = (Button)findViewById(R.id.btnStop);
    textViewTime = (TextView)findViewById(R.id.textViewTime);
    textViewTime.setText("00:03:00");
    final CounterClass timer = new CounterClass(180000,1000);
    btnStart.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            timer.start();
        }
    });
    btnStop.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            timer.cancel();

        }
    });
}
@TargetApi(Build.VERSION_CODES.GINGERBREAD)
@SuppressLint("NewApi")
public class CounterClass extends CountDownTimer {
    public CounterClass(long millisInFuture, long countDownInterval) {
        super(millisInFuture, countDownInterval);
    }
    @Override
    public void onFinish() {
        textViewTime.setText("Completed.");

    }


    @SuppressLint("NewApi")
    @TargetApi(Build.VERSION_CODES.GINGERBREAD)
    @Override

    public void onTick(long millisUntilFinished) {
        long millis = millisUntilFinished;
        String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis),
                TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
                TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
        System.out.println(hms);
        textViewTime.setText(hms);
    }
}

}

Ich würde mich über eure Hilfe sehr freuen. :)

Lg,

-AD ;)

Antworten
  • Forum-Beiträge: 11.137

20.07.2014, 17:48:30 via Website

Bei finish muss dann wieder ein timer.start rein.
So wird dieser von vorne Beginnen.

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

Antworten
Gelöschter Account
  • Forum-Beiträge: 35

20.07.2014, 20:17:44 via Website

Ich hab das so gemacht :

public void onFinish() {

        this.start();

    }

...und dafür das "textViewTime.setText("Completed.";);" weg.

Das funktioniert, jedoch immer nur mit den gleichen Werten also "final CounterClass timer = new CounterClass(180000,1000);". Also wenn 30 sek. rum sind fangen erneut 30 an. Jetzt will ich aber das 20sek beim 2. Durchlauf runtergezählt werden.

Ich habe mir überlegt, dass man einen 2. Timer erzeugen muss und den dann in der onFinish Methode startet.

Benötigt man dafür einen komplett neuen Timer? Falls ja müsste doch eine Fehlermeldung auftreten wenn man this.start(); in die onFinish() Methode packt, weil das Programm wäre ja verwirrt ? Ich bin beim Versuch zumindest gescheitert.

Also:

            public void onFinish() {

                       this.start();   <------- Hier: f&uuml;r anderen Wert aus Timer2 --- Das Programm kann ja nicht wissen welchen Timer es nun starten soll.

                         }

Danke im voraus,

-AD :)

Antworten
  • Forum-Beiträge: 11.137

20.07.2014, 20:44:58 via App

Dann musst du vor dem neu starten in der finish Methode noch die Timerlaufzeit ändern.

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

Antworten
Gelöschter Account
  • Forum-Beiträge: 35

20.07.2014, 21:00:14 via Website

Wie funktioert das?Ich weiß nicht wo ich die TImerlaufzeit speziell für den Aufruf in der onFinish Methode ändere.

Ich habe es aber mit einem Thread probiert:

public void onFinish() {

        try {
            Thread.sleep(15000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        this.start();

    }

Blöd ist nur, dass dann bei 00:00:01 aufgehört wird statt bei 00:00:00. Ansonsten läuft das Programm. Allerdings passiert dan 15 nichts, was ja nicht falsch ist nur nicht direkt die schönste Lösung.

Antworten
  • Forum-Beiträge: 11.137

21.07.2014, 06:55:01 via App

Bietet der Timer keine Methode set time oder setCountdownTime mit sowas solttest du dann Arbeiten können

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

Antworten
Gelöschter Account
  • Forum-Beiträge: 35

21.07.2014, 18:13:21 via Website

Nein ich nutze " final CounterClass timer = new CounterClass(30000,1000); " um die Zeit einzustellen. Hier sind "30000"= 30 Sekunden. Die "1000"
geben die Geschwindigkeit des Zählens an----also hier genau eine Sekunde. Das funktioniert für eine Zeit, ich habe bisher nichts gefunden wo beschrieben wird wie man eine Zweite Zeit direkt hintendran hängt.

Lg,

-AD :)

Antworten
  • Forum-Beiträge: 11.137

21.07.2014, 18:28:04 via Website

Könntest ja auch reinschreiben in die onFinish:

this = new CounterClass(20000,1000);

Kein Plan ob das so geht, war nur ne Idee.

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

Antworten
Gelöschter Account
  • Forum-Beiträge: 35

21.07.2014, 18:46:45 via Website

Es kommt keine Fehlermeldung aber es wird nichts mehr gestartet. Wenn ich this.start(); dazu schreibe startet er einfach die 1. Zeit . Ansonsten finde ich die Idee gut. :)

Antworten
Gelöschter Account
  • Forum-Beiträge: 35

21.07.2014, 20:39:55 via Website

Ich habe mir überlegt, dass Problem anders anzugehen.
Anstatt den 15 Sekunden die im Timer erneut laufen packe ich einfach einen Thread in die onFinish() Methode.

Also nochmal:

public void onFinish() {

    try {
        Thread.sleep(15000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    this.start();

}

Jetzt habe ich aber immernoch nich raus warum der sleep thread bei 00:00.01 anstatt bei 00:00:00 anfängt.
Sobald der sleep thread ertig ist startet ja der normale Timer wieder von neu.

Lg,

-AD :)

Antworten
  • Forum-Beiträge: 235

21.07.2014, 21:44:20 via Website

Hallo,
je mehr du dein Countdown-Timer Komplizierter Programmierst, desto mehr Verzögerungen und ... werden / wird generiert.

Du leitest die CounterClass
(public class CounterClass extends CountDownTimer)
vom CountDownTimer.
In der Abstrakte onFinish() Methode; - kann zwar alles mögliches implementiert:
aber von;

this.start();
this = new CounterClass(20000,1000);

werde ich ABRATEN!
...
weiterhin:
...
String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));

braucht kein Mensch.

Bediene Dich an einem Tutorial - und ergänze weiteres laut API / Doku.

LG
Georg

— geändert am 21.07.2014, 21:52:14

Sorry für Gramatik & Stilistik Fehler.

Antworten
Gelöschter Account
  • Forum-Beiträge: 35

22.07.2014, 17:48:01 via Website

Hallo Georg,

ich probiere einen anderen Weg zu finden um die CounterClass(20000,1000) zu starten.
Danke für die Tips. :)

LG,

-AD :D

Antworten