Вопрос по android – Таймер обратного отсчета с паузой и возобновлением

6

Я хочу сделать таймер обратного отсчета с паузой и перезапуском. Теперь я показываю таймер обратного отсчета, реализуя ontick () и onfinish (). Пожалуйста, помогите мне. Вот код для таймера обратного отсчета

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

}

Ваш Ответ

7   ответов
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()*/
14

   long s1=millisUntilFinished;

когда вы хотите приостановить использование таймера ..

   Counter.cancel();

когда вы хотите продолжить, создайте новый отсчет времени с оставленными миллисекундами.

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

Смотрите эту ссылку

Отличная идея. Это сработало для меня.
1

Мой первый ответ на stackOverFlow, надеюсь, это должно помочь :) ... Вот как я решил проблему, контролируя таймер из Фрагмента, Нижнего листа, Сервиса, Диалога в соответствии с вашими требованиями, сохраняя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

Теперь, когда вы хотите приостановить таймер, измените значениеshouldTimerRun false и возобновить это сделатьtrue.

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

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

Методы помощи :(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();
    }
-1

Хороший и простой способ создать Pause / Resume для вашего 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();
                }
3

Я бы добавил что-то кonTick обработчик для сохранения прогресса таймера в вашем классе (количество оставшихся миллисекунд).

вonPause() метод для вызова деятельностиcancel() по таймеру.

вonResume() Метод для действия создать новый таймер с сохраненным количеством оставшихся миллисекунд.

Смотрите ссылки ниже

ССЫЛКА НА САЙТ

ССЫЛКА НА САЙТ

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.

0

private long startPauseTime;
private long pauseTime = 0L;

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

public void resumen(){ 
    pauseTime +=  System.currentTimeMillis() - startPauseTime; 
}

Похожие вопросы