我正在制作一个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;
}
}
};
我的问题是,当我第三次按下闪烁按钮时,为什么应用程序会崩溃?
答案 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;
}
}
相关链接:
<强>更新强>
由于Timer创建了一个新线程,可能会被认为是重,
如果你需要的只是在活动运行时回调,那么处理程序可以与此链接一起使用 How to set a timer in android