2012-07-16 35 views
6

EL PROBLEMA Tengo problemas para detener el temporizador mientras desarrollo en Android.Temporizador no se detiene en Android

El temporizador ya es nulo cuando se trata de detenerlo.

Luego muevo la inicialización del temporizador fuera de un método como el TimerTask que resuelve el problema nulo pero aún no cancela cuando se invoca timer.cancel();.

El siguiente código es un ejemplo del temporizador que ya es nulo cuando se trata de detener la grabación.

TimerTask

Mi TimerTask se inicializa dentro de la clase pero fuera de un método y los códigos abajo ...

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

& temporizador Temporizador de inicio

entonces tengo un método startRecroding que se llama cuando quiero iniciar el temporizador ...

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

Fin de contador

Me continuación, llamar al método siguiente cuando quiero detener el temporizador ...

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

Cualquier ayuda sería muy apreciada.

+0

¿Has probado task.cancel() seguido de timer.purge()? – Steelight

Respuesta

12
timer = new Timer("Message Timer"); 

Aquí el objeto timer no es un static por lo timer.cancel(); cancelará otra instancia de la clase Timer. Le sugiero que permite crear una variable de instancia estática de la clase Timer en la parte superior de la clase, como a continuación,

private static Timer timer; 
+0

Tan simple. gracias – StuStirling

+4

yo había creado una instancia estática, entonces tampoco va a detenerse – asiya

+0

sí, también he creado una instancia estática y no se va a detener :) – bebosh

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

probar este ejemplo ....

 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; 

    } 

}  

// utilizar por encima de dos funciones para iniciar y detener el temporizador.

2

en el método run(), comprobar si el temporizador es nulo entonces

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

cancelar la operación.

0

Sé que es tarde, pero también encontré este problema en mi proyecto, y espero que mi solución pueda darles algunas ideas. Lo que hice en mi proyecto es la siguiente:

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

Creo que lo que se perdió en las respuestas anteriores es removeCallbacks.

Cuestiones relacionadas