取消后如何重新创建Timer类对象?

时间:2016-03-11 16:23:36

标签: java android timer

我正在制作一个Android应用程序,用户可以在指定的时间间隔后打开/关闭闪光灯。它很好用,除非在第二次调用.cancel()方法后重新创建Timer对象时,它每次都会崩溃应用程序。 这是初始化部分:

Timer timer; //variable of Timer class
TimerTask timerTask; //variable of TimerTask class

这是按下负责打开/关闭闪烁的按钮时调用的方法:

blink.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v){
            delay = Integer.valueOf(startDelay.getText().toString());
            gap = Integer.valueOf(blinkDelay.getText().toString());

            if(!isBlinking) { //isBlinking is a boolean to know whether to stop or re-start timer
                timer = new Timer(); //I'm creating an object of Timer class every time.
                isBlinking = true;
                timer.schedule(timerTask, delay, gap);

            }
            else{
                isBlinking = false;
                stoptimertask(); //this will cancel the 'timer' and make it null.
            }
        }
    });

上面代码中的'stoptimertask()'方法有:

public void stoptimertask() {
    //stop the timer, if it's not already null

    if (timer != null) {
        timer.cancel();
        timer = null;
    }

}

我正在从下面显示的方法设置TimerTask类的'timertask'变量。它在主要活动的onCreate()方法中调用:

public void initializeTimerTask() {

    timerTask = new TimerTask() { //This is passed as the first argument to the timer.schedule() method
        public void run() {//Basically turns on/off flash. Works well.
            if(!state) {
                turnOnFlash();
                state = true;

            }
            else {
                turnOffFlash();
                state = false;
            }

        }
    };

我的问题是,当我第三次按下闪烁按钮时,为什么应用程序会崩溃?

  • 第一次按下时,isBlinking为false,因此if块执行创建Timer类的新对象并启动计时器。
  • 第二次按下时,会调用stoptimertask()取消定时器并将timer变量设置为null。
  • 当第三次使用不同的延迟和间隙值再次按下它时,应该创建一个Timer类的新对象,但应用程序意外崩溃时出现“不幸的是应用程序已停止”错误。 我哪里错了?

2 个答案:

答案 0 :(得分:1)

你也必须清除。

timer.cancel();
timer.purge();

答案 1 :(得分:1)

purge之后忘记cancel

您的代码必须是stoptimertask()方法。

public void stoptimertask() {
    //stop the timer, if it's not already null
    if (timer != null) {
        timer.cancel();
        timer.purge();
        timer = null;
    }
}

相关链接:

  1. Android timer? How-to?
  2. How to set a timer in android
  3. <强>更新

    由于Timer创建了一个新线程,可能会被认为是重

    如果你需要的只是在活动运行时回调,那么处理程序可以与此链接一起使用 How to set a timer in android