2012-04-28 66 views
4

私はカウントダウンタイマーを表示しています。カウントダウンタイマーを表示しています。ontick()とonfinish()を念頭に置いてください。カウントダウンタイマーのコードです。カウントダウンタイマーの一時停止と再開

onTickで
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

答えて

13

は...ミリ秒

long s1=millisUntilFinished; 

あなたはタイマーの使用を一時停止する左method..save

Counter.cancel(); 
私はあなたのクラスでのタイマーの進行状況を保存するために onTickハンドラに何かを追加する

あなたは左ミリ秒単位で新しいcountdowntimerを作成再開したい...

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

See this link

+0

素晴らしいアイデア。それは私のために働いた。 – Oiproks

3

(左ミリ秒数)。

タイマーのアクティビティコールcancel()onPause()メソッドの場合。

アクティビティのonResume()メソッドでは、保存されたミリ秒数の新しいタイマーを作成します。

は、以下を参照してください、私はCountDownTimerを一時停止または停止することはできないことを怖いとonTickに一時停止または停止すると、ユーザーの代わりにTimerTask全く効果がありません

LINK

LINK

0

をリンクします。

は、あなたがこのようなイベントリスナーのを追加することができます。..

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を参照してください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); 
} 

を設定します。

0

私はこのケースでは2つのプライベートVARSを使用しています:

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ボタンのコードです:StackOverflowの上

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の変数を制御してください。あなたの活動に

宣言:のonCreateで

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

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