Java – pause the timer and continue

Please refer to the code posted by @ Yuri here How to stop a timer after certain number of times. If I want to stop it because of some conditions, then restart it What should I do?

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

    }

This is what I tried, but it keeps collapsing

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

Solution

If you have cancelled a timer, you cannot restart it. You must create a timer

See this answer, which contains a video and source code. How did I do something similar

There are basically two methods: pause and resume

Pause:

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

In your resume:

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

This makes the feeling of pause / recovery

If your timer performs different operations based on the state of your application, consider using statepattern

Define abstract state:

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

And provide as many states as possible The key is that one country leads you to another

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

Then change the status in the timer

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();
           }
     }
 },1000 );

Finally, if you need to do the same thing but at different speeds, you can consider using the timing framework It's a little complicated, but let's do some cool animation by allowing some components to be painted at different speeds (not linear)

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>