web-dev-qa-db-fra.com

Mettez la minuterie en pause puis continuez

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();
        }
16
jimmyC

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)

30
SALMAN

FIgured it out, c'était parce que je n'ai pas initialisé la tâche dans startManager ()

1
jimmyC

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.

1
Jonathan S. Fisher