Таймер не останавливается на Android

ПРОБЛЕМА У меня проблемы с остановкой таймера во время разработки в Android.

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

Затем я перемещаю инициализацию таймера вне метода, точно так же, как TimerTask, которая решает нулевую проблему, но все равно не отменяет, когда на нее вызывается timer.cancel();.

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

TimerTask

My TimerTask инициализируется внутри класса, но вне метода и кодов ниже...

private TimerTask task = new TimerTask() {
    @Override
    public void run() {
      Log.e("TRACK_RECORDING_SERVICE","Timer Running");
    }
  };

Таймер и запуск таймера

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

public void startRecording(){
     timer = new Timer("Message Timer");
     timer.scheduleAtFixedRate(this.task, 0, 1000);
 }

Таймер остановки

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

public void stopRecording() {
     if (timer != null) {
         timer.cancel();
         timer = null;
     } else {
         Log.e("TRACK_RECORDING_SERVICE","Timer already null.");
     }
 }

Любая помощь будет высоко оценена.

Ответ 1

timer = new Timer("Message Timer"); 

Здесь ваш объект timer не является static, поэтому timer.cancel(); отменяет другой экземпляр класса Timer. Я предлагаю вам создать статическую переменную экземпляра класса Timer в верхней части класса, как показано ниже,

private static Timer timer;

Ответ 2

в методе run(), проверьте, нет ли таймера, затем

private TimerTask task = new TimerTask() {
@Override
public void run() {
if (timer == null)
	cancel();
...
}

Ответ 3

if(waitTimer != null) {
   waitTimer.cancel();
   waitTimer.purge()
   waitTimer = null;
}

Ответ 4

Попробуйте этот пример....

     TimerTask mTimerTask;
    final Handler handler = new Handler();
    Timer t = new Timer();  
    int nCounter = 0;

//function for start timer
 public void doTimerTask()
    {

        mTimerTask = new TimerTask() 
        {
                public void run() 
                {
                        handler.post(new Runnable() 
                        {
                                public void run()
                                {

                                      nCounter++:       
                                    //your code
                                    .....
                                    ......

                                }
                       });
                }};

            // public void schedule (TimerTask task, long delay, long period) 
            t.schedule(mTimerTask,0,50);  // 

         }

         //function for stop timer
public void stopTimerTask(){

       if(mTimerTask!=null){

          Log.d("TIMER", "timer canceled");
          mTimerTask.cancel();
          nCounter = 0; 

     }

}    

//используйте выше двух функций для таймера запуска и остановки.

Ответ 5

Я знаю это поздно, но я также столкнулся с этой проблемой в своем проекте и надеюсь, что мое решение может дать людям некоторые идеи. Что я сделал в своем проекте, как показано ниже:

Handler handler = new Handler();
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
           //TODO Update UI
        }
    };

    public void stopTimer() {
        if (timer != null) {
            handler.removeCallbacks(runnable);
            timer.cancel();
            timer.purge();
            timer = null;
        }
    }

   public startTimer() {
            timer = new Timer();
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    handler.post(runnable);
                }
            }, 0, 100);
       }

Я думаю, что пропущенные в предыдущих ответах removeCallbacks.

Ответ 6

На всякий случай, если кто-то еще придет сюда, чтобы найти решение этой проблемы, вот мой опыт.

Я запускаю таймер в службе.

startForegroundService(mServiceIntent);

timer = new Timer();

Когда вы обновляете сервис, вы не обязательно сначала отменяете его, вы просто вызываете startForegroundService (mServiceIntent); очередной раз. Если вы не отмените таймер до обновления службы, исходный таймер все еще будет работать в фоновом режиме и вызывать методы, даже если вы остановите таймер в обновленной новой службе.

Таким образом, чтобы подвести итог, остановите свой таймер, прежде чем обновлять или обновлять фоновую задачу. Надеюсь, это кому-нибудь поможет.

Ответ 7

Итак, проблема была в том, что инстанцирование не было фактической остановки таймера.

Каждый раз, когда я звонил:

timer = Timer()
timer!!.scheduleAtFixedRate(object : TimerTask() {
    override fun run() {
       //something  
    }
}, delay, period)

Он создал другой экземпляр, поэтому старый экземпляр все еще работал где-то без возможности остановить его.

Поэтому я просто создал его, когда таймер обнуляется, чтобы ни один предыдущий экземпляр не работал и не работал в фоновом режиме.

if(timer == null) {
    timer = Timer()
    timer!!.scheduleAtFixedRate(object : TimerTask() {
        override fun run() {
            // something
        }
    }, delay, period)
}

Затем просто отмените его и установите в ноль.

fun stopTimer() {
    if (timer != null) {
        timer!!.cancel()
        timer!!.purge()
        timer = null
    }
}