2012-07-16 15 views
6

IL PROBLEMA Ho problemi a fermare il timer durante lo sviluppo in Android.Timer non si arresta in Android

Il timer è già nullo quando si tratta di fermarlo.

Sposto quindi l'inizializzazione del timer all'esterno di un metodo, proprio come il TimerTask che risolve il problema nullo ma che non si annulla ancora quando viene chiamato timer.cancel();.

Il codice seguente è un esempio del timer già nullo quando si tratta di fermare la registrazione.

TimerTask

mio TimerTask viene inizializzato all'interno della classe, ma al di fuori di un metodo e i codici seguenti ...

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

Timer & Avvio timer

Ho poi ho un metodo startRecroding che viene chiamato quando voglio avviare il timer ...

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

Timer stop

ho quindi chiamare il metodo seguito quando voglio fermare il timer ...

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

Qualsiasi aiuto sarebbe molto apprezzato.

+0

hai provato task.cancel() seguito da timer.purge()? – Steelight

risposta

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

Qui l'oggetto timer non è un modo statictimer.cancel(); sarà annullare un'altra istanza della classe Timer. Vi suggerisco di creare una variabile di istanza statica del Timer Class sulla parte superiore della classe, come qui di seguito,

private static Timer timer; 
+0

Così semplice. grazie – StuStirling

+4

avevo creato istanza statica quindi anche non si sarebbe fermata – asiya

+0

sì, ho anche creato istanza statica e non si fermerà :) – bebosh

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

Prova questo esempio ....

 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; 

    } 

}  

// utilizzare sopra due funzioni per il timer di avvio e arresto.

2

nel metodo run(), controllare se il timer è nullo allora

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

annullare l'operazione.

0

So che è tardi, ma ho riscontrato anche questo problema nel mio progetto e spero che la mia soluzione possa dare alle persone alcune idee. Quello che ho fatto nel mio progetto è il seguente:

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

Penso che quello che è mancato nelle risposte precedenti è removeCallbacks.

Problemi correlati