Reportez-vous au code que @Yuri a publié à partir d'ici. Comment arrêter une minuterie après un certain nombre de fois . Si je voulais l'arrêter à cause d'une condition, puis le redémarrer à nouveau. Comment pourrais-je m'y prendre?
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);
}
Voici ce que j'ai essayé, mais ça continue de s'écraser sur moi.
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();
}
Si vous avez déjà annulé une minuterie, vous ne pouvez pas la redémarrer, vous devrez en créer une nouvelle.
Voir ceci réponse , il contient une vidéo et le code source comment j'ai fait quelque chose de similaire.
Fondamentalement, il existe deux méthodes: pause et reprise
En pause:
public void pause() {
this.timer.cancel();
}
En résumé:
public void resume() {
this.timer = new Timer();
this.timer.schedule( aTask, 0, 1000 );
}
Cela rend la perception de pause/reprise.
Si vos temporisateurs effectuent différentes actions en fonction de l'état de l'application, vous pouvez envisager d'utiliser le StatePattern
Définissez d'abord un état abstrait:
abstract class TaskState {
public void run();
public TaskState next();
}
Et fournissez autant d'états que vous le souhaitez. La clé est qu'un État vous mène à un autre.
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();
}
}
Et puis vous changez l'état dans votre minuterie.
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 );
Enfin, si ce dont vous avez besoin est d'exécuter la même chose, mais à des rythmes différents, vous pouvez envisager d'utiliser le TimingFramework . C'est un peu plus complexe mais faisons des animations sympas, en permettant que la peinture de certains composants se déroule à des rythmes différents (au lieu d'être linéaire)
FIgured it out, c'était parce que je n'ai pas initialisé la tâche dans startManager ()
Il semble qu'il n'y ait aucun moyen de le faire: http://docs.Oracle.com/javaee/6/api/javax/ejb/Timer.html
Vous pouvez probablement annuler le minuteur, puis en créer un nouveau.