暂停计时器,然后继续下去(Pause the timer and then continue it)

2019-06-26 09:55发布

指的是@Yuri从这里发布的代码。 如何制止一定的次数后,计时器 。 如果我想阻止它,因为一些条件,然后再重新启动它。 我将如何去这样做呢?

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

    }

下面是我尝试过,但它总是崩溃在我身上。

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

Answer 1:

如果您已经取消了一个定时器,你不能重新启动它,你必须创建一个新的。

看到这个答案 ,它包含了视频的源代码,我怎么没有类似的东西。

基本上有两种方法:暂停和恢复

在暂停:

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

在简历:

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

这使得暂停/恢复的感知。

如果你的计时器基于应用程序的状态,执行不同的操作,你可以考虑使用StatePattern

拳定义抽象状态:

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

而当你想提供尽可能多的国家。 关键是,一个国家引导你到另一个。

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

然后您更改计时器的状态。

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

最后,如果你需要的是执行同样的事情,但以不同的速度,你可以考虑使用TimingFramework 。 这是一个比较复杂的,但让你做很酷的动画,通过在特定组件的绘画发生在不同的速度(而不是被线性)



Answer 2:

目前看来是没有办法做到这一点: http://docs.oracle.com/javaee/6/api/javax/ejb/Timer.html

你可能会取消计时器,然后创建一个新的。



Answer 3:

想通了,那是因为我没有初始化startManager任务()



文章来源: Pause the timer and then continue it