【问题标题】:Pause the timer and then continue it暂停计时器,然后继续
【发布时间】:2012-07-18 00:44:29
【问题描述】:

请参阅@Yuri 从此处发布的代码。 How to stop a timer after certain number of times 。如果我因为某些情况想停止它然后重新启动它。我该怎么做呢?

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

【问题讨论】:

    标签: java android timer


    【解决方案1】:

    似乎没有办法做到这一点:http://docs.oracle.com/javaee/6/api/javax/ejb/Timer.html

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

    【讨论】:

      【解决方案2】:

      如果您已经取消了一个计时器,则无法重新启动它,您必须创建一个新的。

      看到这个answer,它包含一个视频和我如何做类似事情的源代码。

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

      暂停:

      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。它有点复杂,但让我们通过允许某些组件的绘制以不同的速率(而不是线性)来制作很酷的动画

      【讨论】:

      • 我尝试取消它然后创建一个新计时器,但它仍然导致它崩溃。你能解释一下为什么我需要处理程序吗?我可以拿出来吗?实际上,我是在没有处理程序的情况下先尝试的。
      • 处理程序允许您发送和处理与线程的 MessageQueue 关联的 Message 和 Runnable 对象。每个 Handler 实例都与单个线程和该线程的消息队列相关联。当您创建一个新的处理程序时,它会绑定到创建它的线程的线程/消息队列——从那时起,它会将消息和可运行对象传递到该消息队列并在它们从消息中出来时执行它们排队。
      • 我遇到了一个问题,我认为当旧的计时器没有完全停止时,它会创建太多的新计时器。例如,我取消了一个定时器,但是如果任务正在运行,它需要等到它完成。然而,在我取消它之后(在我的代码中)(在之前的计时器实际完成之前),我启动了一个新的 startManager 并创建了一个新的计时器。有没有办法确保在旧任务完全停止运行之前不会启动计时器。
      【解决方案3】:

      搞清楚了,是因为我没有在startManager()中初始化任务

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-14
        • 1970-01-01
        相关资源
        最近更新 更多