2012-07-18 13 views
11

Consulte el código que @Yuri publicó desde aquí. How to stop a timer after certain number of times. Si quería detenerlo debido a alguna condición y luego reiniciarlo nuevamente. ¿Cómo podría hacerlo?Pausa el temporizador y luego continúa

private final static int DELAY = 10000; 
    private final Handler handler = new Handler(); 
    private final Timer timer = new Timer(); 
    private final TimerTask task = new TimerTask() { 
     private int counter = 0; 
     public void run() { 
      handler.post(new Runnable() { 
       public void run() { 
        Toast.makeText(MainActivity.this, "test", Toast.LENGTH_SHORT).show(); 
       } 
      }); 
      if(++counter == 4) { 
       timer.cancel(); 
      } 

    //do some stuff in my app 
    //restart the timer again 

     } 
    }; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     timer.schedule(task, DELAY, DELAY); 

    } 

Esto es lo que he intentado, pero sigue chocando conmigo.

final int DELAY = 10000; 
     Timer timer; 
     MyTask task; 
     startManager Scanner; 
     Handler handler; 



     public class MyTask extends TimerTask { 

      @Override 
      public void run() { 
       handler.post(new Runnable() { 
        public void run() { 
         //do Stuff here 
         } 
     }); 
    } 
     public class startManager { 

      public startManager() { 
       handler = new Handler(); 
       timer = new Timer(); 
      } 

      public void start() { 

       timer.schedule(task, 0, DELAY); 
      } 

      public void cancel() { 

       timer.cancel(); 
       timer.purge(); 

      } 
     } 

    } 

@Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

Scanner = new startManager(); 
//do some stuff 
if (...) 
Scanner.cancel() 
//restart the timer and its task 
Scanner=new startManager(); 
     } 

Respuesta

24

Si ya ha cancelado un temporizador, no puede reiniciarlo, tendrá que crear uno nuevo.

Vea este answer, contiene un video y el código fuente de cómo hice algo similar.

Básicamente hay dos métodos: pausar y reanudar

En pausa:

public void pause() { 
    this.timer.cancel(); 
} 

En resumen:

public void resume() { 
    this.timer = new Timer(); 
    this.timer.schedule(aTask, 0, 1000); 
} 

Eso hace que la percepción de pausa/reanudación.

Si sus temporizadores realizan diferentes acciones en función del estado de la aplicación que puede considerar usar el StatePattern

Puño definir un estado abstracto:

abstract class TaskState { 
    public void run(); 
    public TaskState next(); 
} 

y proporcionar la mayor cantidad de estados que lo desee. La clave es que un estado te lleva a otro.

class InitialState extends TaskState { 
    public void run() { 
     System.out.println("starting..."); 
    } 
    public TaskState next() { 
     return new FinalState(); 
    } 
} 
class FinalState extends TaskState { 
    public void run() { 
     System.out.println("Finishing..."); 
    } 
    public TaskState next(){ 
     return new InitialState(); 
    } 
} 

Y luego cambia el estado en su temporizador.

Timer timer = new Timer(); 
TaskState state = new InitialState(); 

timer.schedule(new TimerTask() { 
    public void run() { 
      this.state.run(); 
      if(shouldChangeState()) { 
       this.state = this.state.next(); 
      } 
    } 
}, 0, 1000); 

Por último, si lo que necesita es llevar a cabo la misma cosa, pero a un ritmo diferente, es posible considerar el uso de la TimingFramework. Es un poco más complejo, pero vamos a hacer animaciones geniales, al permitir que la pintura de cierto componente tenga lugar a diferentes velocidades (en lugar de ser lineal)

+0

Intenté cancelarlo y luego crear un nuevo temporizador, pero todavía está bloqueando. ¿Puedes explicar por qué necesito el controlador? ¿Puedo sacarlo? En realidad, lo intenté primero sin el controlador. – jimmyC

+0

Un controlador le permite enviar y procesar mensajes y objetos ejecutables asociados con MessageQueue de un hilo. Cada instancia de Handler está asociada con un único hilo y la cola de mensajes de ese hilo. Cuando crea un nuevo Manejador, está vinculado a la fila/cola de mensajes del subproceso que lo está creando. A partir de ese momento, entregará los mensajes y los ejecutables a esa cola de mensajes y los ejecutará a medida que salgan del mensaje. cola. – SALMAN

+0

Me he encontrado con un problema en el que creo que está creando demasiados nuevos temporizadores cuando el anterior no se ha detenido por completo. Por ejemplo, cancelo un temporizador, pero si la tarea se está ejecutando, debe esperar hasta que finalice.Inmediatamente después de que lo cancele (en mi código), sin embargo (antes de que el temporizador anterior realmente haya terminado), inicio un nuevo startManager y crea un nuevo temporizador. ¿Hay alguna manera de garantizar que un temporizador no se inicie hasta que la tarea anterior haya dejado de ejecutarse por completo? – jimmyC

1

Descubierto, fue porque no inicié la tarea en startManager()

Cuestiones relacionadas