Android CountDownTimer Example

Filed Under: Android

In this android countdown timer example, we’ll implement a timer object to display the progress in a ProgressBar. The application we’ll build in this tutorial is a useful component in Quiz apps where the time left to complete the level is displayed graphically to enhance the user experience.

Android CountDownTimer

Android CountDownTimer class is used to schedule a countdown until a time in the future defined by the user, with regular notifications on intervals along the way. This class is an abstract class whose methods need to be overridden to implement it in our project. The following line needs to be added in our activity to import the class :

import android.os.CountDownTimer;

The relevant methods of the CountDownTimer Class are given below.

  1. synchronized final void cancel() : This is used to cancel the countdown
  2. abstract void onFinish() : This callback method is fired when the timer finishes
  3. abstract void onTick(long millisUntilFinished) : This callback method is fired on regular intervals
  4. synchronized final CountDownTimer start() : This method is used to start the countdown

The signature of the public constructor of the CountDownTimer class is given below.

CountDownTimer(long millisInFuture, long countDownInterval)

The parameters of the constructors are defined as follows :

  • millisInFuture : The number of milli seconds in the future from the call to start() until the countdown is done and onFinish() is called
  • countDownInterval : The interval along the way to receive onTick(long) callbacks

In this project we’ll update the time values in a ProgressBar as the onTick() method is invoked repeatedly.

Android Countdown Timer Example Project Structure

android countdown timer example project

Android Countdown Timer Code

The activity_main.xml consists of two buttons i.e. the start and stop timer buttons and a ProgressBar to display the time.

activity_main.xml


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:indeterminate="false"
        android:max="10"
        android:minHeight="50dp"
        android:minWidth="200dp"
        android:progress="0"
        android:layout_centerVertical="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Start Timer"
        android:id="@+id/button"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="61dp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Stop Timer"
        android:id="@+id/button2"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="46dp"
        android:layout_below="@+id/progressBar" />

</RelativeLayout>

The MainActivity.java is given below :


package com.journaldev.countdowntimer;

import android.os.CountDownTimer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    ProgressBar progressBar;
    Button start_timer,stop_timer;
    MyCountDownTimer myCountDownTimer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        progressBar=(ProgressBar)findViewById(R.id.progressBar);
        start_timer=(Button)findViewById(R.id.button);
        stop_timer=(Button)findViewById(R.id.button2);

        start_timer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                myCountDownTimer = new MyCountDownTimer(10000, 1000);
                myCountDownTimer.start();

            }
        });

        stop_timer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                myCountDownTimer.cancel();

            }
        });

    }

    public class MyCountDownTimer extends CountDownTimer {

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

        @Override
        public void onTick(long millisUntilFinished) {

            int progress = (int) (millisUntilFinished/1000);

            progressBar.setProgress(progressBar.getMax()-progress);
        }

        @Override
        public void onFinish() {
            finish();
        }
    }
}

In the above code we’ve defined an Anonymous Inner Class called MyCountDownTimer. In this example we’ve set a Timer for 10 seconds that updates after every second. By default the timer displays/updates the time in decreasing order ( as its named CountDown!), Hence to show the progress in increasing order we’ve subtracted the time from the max time.

The timer once stopped restarts from the beginning. Below is our android countdown timer app in action.

android countdowntimer example

This brings an end to countdown timer android tutorial. You can download the final Android CountDownTimer Project from the below link.

Reference: Official Documentation

Comments

  1. Shantanu more says:

    It donot update the last second ??? why

  2. Joseph Werns says:

    Thank you so much for your blog. I have learn so much.

    One question about the follow. “In the above code we’ve defined an Anonymous Inner Class called MyCountDownTimer”

    Wouldn’t the class not be Anonymous if it has a name?

  3. Long Luong says:

    Using non static inner class will leak your memory.

  4. julfikar says:

    after finishing the progress bar why apps is closing?

    1. Anupam says:

      Since I’ve designed it to close.
      Remove finish() from the onFinish() method.

      Thanks

  5. Camilo Fernando says:

    Thanks!

Leave a Reply

Your email address will not be published. Required fields are marked *

close
Generic selectors
Exact matches only
Search in title
Search in content
Search in posts
Search in pages