Android-Programmierung: Timer
Willemers Informatik-Ecke

Der CountDownTimer von Android

Android stellt einen CountDownTimer zur Verfügung, der verwendet werden kann, um alle Sekunden ein Ereignis auszulösen.

Ein eigener Timer

import android.os.CountDownTimer;

public class MeinTimer extends CountDownTimer {

    public MeinTimer(long millisInFuture, long countDownInterval) {
        super(millisInFuture, countDownInterval);
    }

    @Override
    public void onTick(long millisUntilFinished) {
    }

    @Override
    public void onFinish() {
    }

}

Inbetriebname

Zur Inbetriebnahme wird eine Instanz der Klasse erstellt. Der erste Parameter ist die Laufzeit insgesamt. Der zweite gibt an, wie oft der Timer auslösen soll, also onTick aufrufen soll.

Der Timer läuft durch Aufruf der Methode start los.

Mit dem Aufruf von cancel kann die weitere Auslösung von Events unterbunden werden.

MeinTimer timer= new MeinTimer(max * 1000, 1000);
timer.start();

Direkter Start eines CountDownTimers

Alternativ kann der CountDownTimer auch direkt verwendet werden.
CountDownTimer timer = new CountDownTimer(millisInFuture, countDownInterval) {
    @Override
    public void onTick(long l) {
    }

    @Override
    public void onFinish() {
    }
};

Chronometer: Eine tickende TextView

Android stellt ein Kontrollelement namens Chronometer zur Verfügung, das im Layout wie eine TextView eingesetzt werden kann. Man erzeugt im Designer eine TextView und ersetzt das Wort TextView in der XML-Layout-Datei durch das Wort Chronometer.

    <Chronometer
        android:id="@+id/tvTick"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
Das Attribut android:text muss nun nicht mehr gesetzt werden. Der Chronometer setzt ihn automatisch auf 00:00.

Start und Stop

Aus der Activity wird der Chronometer wie jede andere View über findViewById ermittelt. Für diese existieren die Methoden start und stop. Um den Timer auf 0 zu setzen, verwendet man setBase und übergibt den Wert SystemClock.elapsedRealtime().
Chronometer chro = (Chronometer) findViewById(R.id.tvTick);
chro.setBase(SystemClock.elapsedRealtime());
chro.start();
Die vergangene Zeit ermittelt man, indem man einen OnChronometerTickListener aufsetzt und in dessen Methode onChronometerTick eine globale Zählervariable hochzählt.
Chronometer chro = (Chronometer) findViewById(R.id.tvTick);
chro.start();
chro.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
    @Override
    public void onChronometerTick(Chronometer chronometer) {
        sekunden++;
    }
});