2013-03-15 20 views
14

Ho un'animazione nella mia app per Android che lampeggia in una TextView di colori diversi. Ho usato un metodo TimerTask, Timer e Runnable per implementarlo. Quello che devo fare è interrompere il thread quando un utente lascia l'app durante questa animazione in onPause(), e riprendere il thread quando l'utente torna all'app in onResume(). Quello che segue è il codice che ho implementato, ma non funziona (i pezzi onPause() e onResume()), e non capisco perché. Ho letto alcuni altri post su argomenti simili, ma non mi hanno aiutato a capire cosa fare nella mia situazione. Ho letto che TimerTasks sono obsoleti e probabilmente dovrei usare un metodo ExecutorService; non mi è chiaro come implementare questa funzione.Come mettere in pausa e riprendere un TimerTask/Timer

...timerStep5 = new TimerTask() { 

     @Override 
     public void run() { 
      runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
       if (b5) { 
        cashButton2SignalText.setBackgroundColor(Color.RED); 
        cashButton2SignalText.setTextColor(Color.WHITE); 
        b5=false; 
       } else { 
        cashButton2SignalText.setBackgroundColor(Color.WHITE); 
        cashButton2SignalText.setTextColor(Color.RED); 
        b5=true; 
       } 
       } 
      }); 
     } 
}; 

timer5.schedule(timerStep5,250,250); 

} 

public void onPause(){ 

    super.onPause(); 

    timerStep5.cancel(); 

} 

public void onResume(){ 

    super.onResume(); 

    timerStep5.run(); 

} 
+0

Possibile duplicato [Pausa/arresto e l'avvio/ripresa Java TimerTask continuamente?] (Http://stackoverflow.com/questions/2098642/pausing-stopping-and-starting-resuming-java-timertask-continuously) – Gboy

risposta

12

Dopo un TimerTask viene annullato, non è possibile eseguire ancora una volta, è necessario creare una nuova istanza.

Continua qui:

https://stackoverflow.com/a/2098678/727768

ScheduledThreadPoolExecutor è raccomandato per il codice più recente, gestisce i casi come eccezioni e le attività che prendono tempo più lungo l'intervallo pianificato.

Ma per il vostro compito, TimerTask dovrebbe essere sufficiente.

+0

Ok, ho visto questo post prima e sono stato confuso con esso; forse puoi chiarire qualcosa per me: un utente potrebbe lasciare la mia app durante l'attività di TimerTask e tornare a quell'attività più di una volta. Non significherebbe che dovrei creare una nuova istanza di un TimerTask all'interno di onResume() ogni volta che l'utente lascia questa attività e restituisce? – embersofadyingfire

+0

Domanda: Se dovessi ignorare l'azione di un utente che abbandonava questa attività per un momento e restituiva, e lasciava fuori qualsiasi implementazione per mettere in pausa e riprendere il TimerTask, ma implementava onStop() per cancellare TimerTask quando l'utente si spostava in avanti per un'altra attività, ciò causerebbe qualche tipo di perdita di memoria mentre l'attività TimerTask è in pausa? – embersofadyingfire

+1

Non penso che ci saranno perdite di memoria, ma non ha senso lasciare che l'attività di aggiornamento dell'interfaccia utente venga eseguita in background senza ottenere nulla. Sì, dovresti creare TimerTask al volo e non è riutilizzabile. È progettato in questo modo. (Immagino per la sicurezza del thread) Anche onResume non è un circuito chiuso, il costo della creazione di un oggetto è trascurabile. –

2

Ecco come l'ho fatto. Aggiungi pauseTimer booleano dove mai si verifica la pausa (forse ascoltatore di pulsanti) e non conteggiare il timer se è true.

private void timer(){ 
    Timer timer = new Timer(); 
    tv_timer = (TextView) findViewById(R.id.tv_locationTimer); 
    countTimer = 0; 
    timer.scheduleAtFixedRate(new TimerTask() { 
     @Override 
     public void run() { 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        String s_time = String.format("%02d:%02d:%02d", 
          countTimer/3600, 
          (countTimer % 3600)/60, 
          countTimer % 60); 
        tv_timer.setText(s_time); 
        if (!pauseTimer) countTimer++; 
       } 
      }); 
     } 
    }, 1000, 1000); 
} 
Problemi correlati