2012-04-28 220 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(); 
    }