2012-04-28 225 views
4

我想做暂停和重新启动倒数计时器。现在我显示倒数计时器通过实施ontick()和onfinish()。请帮助我out.here是th代码倒数计时器倒数计时暂停和恢复

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!"); 
} 

} 
+0

[有在单独的线程的答案。试试看](http://stackoverflow.com/questions/9630398/how-can-i-pause-the-timer-in-android/9663508#9663508) – Solem 2016-01-21 02:54:51

回答

13
在onTick

method..save毫秒左

long s1=millisUntilFinished; 
时要暂停计时器使用

..

Counter.cancel(); 

当你想恢复创建左毫秒的新countdowntimer ..

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

See this link

+0

好主意。它为我工作。 – Oiproks 2017-11-14 10:01:34

3

我想补充一些东西到onTick处理程序保存在你的类定时器的进度(左毫秒数)。

onPause()方法的活动调用cancel()对计时器。

在该活动的onResume()方法中,创建一个剩余毫秒数的新计时器。

请参考以下链接

LINK

LINK

0

恐怕是不可能暂停或停止CountDownTimer和暂停或停止在onTick有任何用户TimerTask,而不是没有任何影响。

搭建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); 
} 

您可以添加事件侦听器的这样的..

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); 
    } 
}; 

更多参考Android Documentation

0

我用两个私人瓦尔在这种情况下:

private long startPauseTime; 
private long pauseTime = 0L; 

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

public void resumen(){ 
    pauseTime += System.currentTimeMillis() - startPauseTime; 
} 
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()*/ 
-1

一个很好的和简单的方法来创建一个暂停/继续为您CountDownTimer是为您创造定时器启动一个单独的方法,暂停和恢复如下:

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"); 
      } 

的timerStart具有长参数,因为它通过以下所示的resume()方法被重复使用。请记住将您的milliTillFinished(以上为milliLeft)存储起来,以便您可以使用resume()方法发送它。暂停和下面分别恢复方法:

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

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

这里是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(); 
       } 
0

我在计算器上的第一个答案,希望它应该帮助:) ... 这是怎么了我根据您的要求解决了问题,从片段,底部表格,服务,对话框控制计时器,请保留一个static boolean变量来控制。

声明在你的活动:

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

在的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 

现在,每当你想暂停计时器变化shouldTimerRunfalse值,并恢复使其true

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

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

帮助的方法:(可以跳过

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(); 
    }