9

I want to do countdown timer with pause and restart.Now i am displaying countdown timer By implenting ontick() and onfinish().please help me out.HEre is th code for countdown timer

final CountDownTimer Counter1 = new CountDownTimer(timervalue1 , 1000)

     {
 public void onTick(long millisUntilFinished)

  {
            System.out.println("onTick method!"(String.valueOf(millisUntilFinished/1000)));long s1=millisUntilFinished;
  }

public void onFinish() 

{
            System.out.println("Finished!");
}

}
Vijaya
  • 574
  • 4
  • 10
  • 25
  • [There's an answer on separate thread. Try it out](http://stackoverflow.com/questions/9630398/how-can-i-pause-the-timer-in-android/9663508#9663508) – Solem Jan 21 '16 at 02:54

8 Answers8

20

in onTick method..save the milliseconds left

   long s1=millisUntilFinished;

when you want to pause the timer use..

   Counter.cancel();

when you want to resume create a new countdowntimer with left milliseconds..

 timervalue=s1
  counter= new Counter1();
   counter.start();

See this link

Community
  • 1
  • 1
5hssba
  • 8,079
  • 2
  • 33
  • 35
3

I would add something to the onTick handler to save the progress of the timer in your class (number of milliseconds left).

In the onPause() method for the activity call cancel() on the timer.

In the onResume() method for the activity create a new timer with the saved number of milliseconds left.

Refer the below links

LINK

LINK

Community
  • 1
  • 1
Shankar Agarwal
  • 34,573
  • 7
  • 66
  • 64
2

I'm using two private vars in this case:

private long startPauseTime;
private long pauseTime = 0L;

public void pause() { 
    startPauseTime = System.currentTimeMillis(); 
}

public void resumen(){ 
    pauseTime +=  System.currentTimeMillis() - startPauseTime; 
}
Kalamarico
  • 5,466
  • 22
  • 53
  • 70
Jimmy Collazos
  • 1,924
  • 2
  • 13
  • 7
2

My first answer on stackOverFlow, hope it should help :) ... This is how I solved the problem, control timer from Fragment, Bottomsheet, Service, Dialog as per your requirement, keep a static boolean variable to control.

declare in your Activity:

long presetTime, runningTime;    
Handler mHandler =new Handler();    
Runnable countDownRunnable;
Toast toastObj;
public static boolean shouldTimerRun = true;
TextView counterTv;

In onCreate:

presetTime =60000L;
runningTime= presetTime;
//setting up Timer
countDownRunnable=new Runnable() {
       @Override
         public void run() {
          if (shouldTimerRun) //if false, it runs but skips counting
          {
                counterTv.setText(simplifyTimeInMillis(runningTime));
             if (runningTime==0) {
                 deployToast("Task Completed"); //show toast on task completion 
                }
             runningTime -= 1000;
             presetTime = runningTime; //to resume the timer from last position
          }
          mHandler.postDelayed(countDownRunnable,1000); //simulating on-tick
         }
    };
mHandler.post(countDownRunnable); // Start our CountdownTimer

Now, whenever you want to pause the timer change the value of shouldTimerRun false and to resume make it true.

@Override
    public void onResume() {
        super.onResume();
        shouldTimerRun=true;
    }

    @Override
    public void onPause() {
        super.onPause();
        shouldTimerRun=false;
        deployToast("Timer is paused !!");
    }

Helping methods: (can be skipped)

public static String simplifyTimeInMillis(long time) {

        String result="";
        long difference = time;
        long secondsInMilli = 1000;
        long minutesInMilli = secondsInMilli * 60;
        long hoursInMilli = minutesInMilli * 60;

        if (difference<1000){
            return "0";
        }

        if (difference>=3600000) {
            result = result + String.valueOf(difference / hoursInMilli) + "hr ";
            difference = difference % hoursInMilli;
        }
        if (difference>=60000) {
            result = result + String.valueOf(difference / minutesInMilli) + "m ";
            difference = difference % minutesInMilli;
        }
        if (difference>=1000){
            result = result + String.valueOf(difference / secondsInMilli) + "s";
        }

        return result;
    }

public void deployToast(String msg){
        if (toastObj!=null)
            toastObj.cancel();
        toastObj = Toast.makeText(mContext,msg,Toast.LENGTH_SHORT);
        toastObj.show();
    }
Vishal Sharma
  • 311
  • 3
  • 7
0

I am afraid that it is not possible to pause or stop CountDownTimer and pausing or stopping in onTick has no effect whatsoever user TimerTask instead.

Set up the TimerTask

class UpdateTimeTask extends TimerTask {
   public void run() {
       long millis = System.currentTimeMillis() - startTime;
       int seconds = (int) (millis / 1000);
       int minutes = seconds / 60;
       seconds     = seconds % 60;

       timeLabel.setText(String.format("%d:%02d", minutes, seconds));
   }

}
if(startTime == 0L) {
   startTime = evt.getWhen();
   timer = new Timer();
   timer.schedule(new UpdateTimeTask(), 100, 200);
}

You can add event listener's like this..

private Handler mHandler = new Handler();

...

OnClickListener mStartListener = new OnClickListener() {
   public void onClick(View v) {
       if (mStartTime == 0L) {
            mStartTime = System.currentTimeMillis();
            mHandler.removeCallbacks(mUpdateTimeTask);
            mHandler.postDelayed(mUpdateTimeTask, 100);
       }
   }
};

OnClickListener mStopListener = new OnClickListener() {
   public void onClick(View v) {
       mHandler.removeCallbacks(mUpdateTimeTask);
   }
};

For more refer to Android Documentation.

Arif Nadeem
  • 8,524
  • 7
  • 47
  • 78
0
//This timer will show min:sec format and can be paused and resumed

public class YourClass extends Activity{
TextView timer;
CountDownTimer ct;
long c = 150000; // 2min:30sec Timer
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.YourXmlLayout);
    timer = (TextView)findViewById(R.id.Yourtimer)
    startTimer(); // it will start the timer

}

public void startTimer(){
ct = new CountDownTimer(c,1000) {
    @Override
    public void onTick(long millisUntilFinished) {
    // Code to show the timer in min:sec form
    // Here timer is a TextView so
    timer.setText(""+String.format("%02d:%02d",millisUntilFinished/60000,(millisUntilFinished/1000)%60));
    c = millisUntilFinished; // it will store millisLeft
    }

    @Override
    public void onFinish() {
        //your code here

    }
};
ct.start();

}
/*===========================================================
*after creating this you can pause this by typing ct.cancel()
*and resume by typing startTimer()*/
0
public class MainActivity extends AppCompatActivity {

TextView textView;

CountDownTimer ctimer;
boolean runCountDown;
private long leftTime;
private static final long MILL_IN_FUTURE = 6000;

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

    textView = findViewById(R.id.text_view);
    textView.setText("Click to start");
    textView.setOnClickListener(this::clickStartAndPauseAndResume);
    leftTime = MILL_IN_FUTURE;

}


public void clickStartAndPauseAndResume(View view) {

    if (!runCountDown) {


        long time = (leftTime == 0 || leftTime == MILL_IN_FUTURE) ? MILL_IN_FUTURE : leftTime;
        ctimer = new CountDownTimer(time, 1) {

            @Override
            public void onTick(long l) {

                leftTime = l;
                textView.setText(l + "ms");
            }

            @Override
            public void onFinish() {

                textView.setText("Done");
                leftTime = 0;
                runCountDown = false;
                textView.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        textView.setText("Click to start");
                    }
                }, 1000);
            }
        }.start();
        runCountDown = true;
    } else {
        ctimer.cancel();
        textView.setText(textView.getText() + "\n Click to resume");
        runCountDown = false;
    }
 }
}
-1

A nice and simple way to create a Pause/Resume for your CountDownTimer is to create a separate method for your timer start, pause and resume as follows:

public void timerStart(long timeLengthMilli) {
        timer = new CountDownTimer(timeLengthMilli, 1000) {

            @Override
            public void onTick(long milliTillFinish) {
                milliLeft=milliTillFinish;
                min = (milliTillFinish/(1000*60));
                sec = ((milliTillFinish/1000)-min*60);
                clock.setText(Long.toString(min)+":"+Long.toString(sec));
                Log.i("Tick", "Tock");
            }

The timerStart has a long parameter as it will be reused by the resume() method below. Remember to store your milliTillFinished (above as milliLeft) so that you may send it through in your resume() method. Pause and resume methods below respectively:

public void timerPause() {
        timer.cancel();
    }

    private void timerResume() {
        Log.i("min", Long.toString(min));
        Log.i("Sec", Long.toString(sec));
        timerStart(milliLeft);
    }

Here is the code for the button FYI:

startPause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(startPause.getText().equals("Start")){
                    Log.i("Started", startPause.getText().toString());
                    startPause.setText("Pause");
                    timerStart(15*1000);
                } else if (startPause.getText().equals("Pause")){
                    Log.i("Paused", startPause.getText().toString());
                    startPause.setText("Resume");
                    timerPause();
                } else if (startPause.getText().equals("Resume")){
                    startPause.setText("Pause");
                    timerResume();
                }
Josh
  • 2,122
  • 1
  • 21
  • 28