问题 我在android中开发时遇到了阻止Timer的问题。
当停止计时器时,计时器已经为空。
然后我将定时器初始化移到方法之外,就像TimerTask一样,它解决了null问题,但在调用timer.cancel();
时仍未取消。
下面的代码是计时器在停止录制时已经为空的示例。
的TimerTask
我的TimerTask
在课堂内初始化,但在方法和下面的代码之外......
private TimerTask task = new TimerTask() {
@Override
public void run() {
Log.e("TRACK_RECORDING_SERVICE","Timer Running");
}
};
计时器&定时器启动
然后我有一个startRecroding方法,当我想启动计时器时调用它...
public void startRecording(){
timer = new Timer("Message Timer");
timer.scheduleAtFixedRate(this.task, 0, 1000);
}
计时器停止
当我想要停止计时器时,我会调用以下方法......
public void stopRecording() {
if (timer != null) {
timer.cancel();
timer = null;
} else {
Log.e("TRACK_RECORDING_SERVICE","Timer already null.");
}
}
非常感谢任何帮助。
答案 0 :(得分:18)
timer = new Timer("Message Timer");
此处您的对象timer
不是static
,因此timer.cancel();
将取消Timer类的另一个实例。我建议你在类的顶部创建一个Timer Class的静态实例变量,如下所示,
private static Timer timer;
答案 1 :(得分:2)
在run()方法中,检查timer是否为null然后
private TimerTask task = new TimerTask() {
@Override
public void run() {
if (timer == null)
cancel();
...
}
取消操作。
答案 2 :(得分:1)
if(waitTimer != null) {
waitTimer.cancel();
waitTimer.purge()
waitTimer = null;
}
答案 3 :(得分:0)
试试这个例子......
TimerTask mTimerTask;
final Handler handler = new Handler();
Timer t = new Timer();
int nCounter = 0;
//function for start timer
public void doTimerTask()
{
mTimerTask = new TimerTask()
{
public void run()
{
handler.post(new Runnable()
{
public void run()
{
nCounter++:
//your code
.....
......
}
});
}};
// public void schedule (TimerTask task, long delay, long period)
t.schedule(mTimerTask,0,50); //
}
//function for stop timer
public void stopTimerTask(){
if(mTimerTask!=null){
Log.d("TIMER", "timer canceled");
mTimerTask.cancel();
nCounter = 0;
}
}
//使用上面两个函数来启动和停止计时器。
答案 4 :(得分:0)
我知道它已经很晚了,但我也在我的项目中遇到过这个问题,希望我的解决方案可以给人们一些想法。我在项目中所做的工作如下:
Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
//TODO Update UI
}
};
public void stopTimer() {
if (timer != null) {
handler.removeCallbacks(runnable);
timer.cancel();
timer.purge();
timer = null;
}
}
public startTimer() {
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
handler.post(runnable);
}
}, 0, 100);
}
我认为以前的答案错过了 removeCallbacks 。
答案 5 :(得分:0)
以防万一有人仍然来这里找到解决这个问题的方法,这就是我的经验。
我正在服务中运行计时器。
startForegroundService(mServiceIntent);
timer = new Timer();
刷新服务时,不必先取消服务,只需调用startForegroundService(mServiceIntent);。再次。 如果您没有在刷新服务之前取消计时器,则即使您在刷新的新服务中停止了计时器,原始计时器仍在后台运行并调用方法。
因此,总结起来,请在刷新或更新后台任务之前停止计时器。 希望对您有所帮助。
答案 6 :(得分:0)
好吧,问题出在实例化上而不是计时器的实际停止上。
我每次都打电话给
timer = Timer()
timer!!.scheduleAtFixedRate(object : TimerTask() {
override fun run() {
//something
}
}, delay, period)
它创建了另一个实例,因此旧实例仍在运行,无法停止它。
因此,我只确保在计时器为null时实例化它,以使以前的实例不会在后台运行并且仍在后台运行。
if(timer == null) {
timer = Timer()
timer!!.scheduleAtFixedRate(object : TimerTask() {
override fun run() {
// something
}
}, delay, period)
}
然后将其取消并将其设置为null。
fun stopTimer() {
if (timer != null) {
timer!!.cancel()
timer!!.purge()
timer = null
}
}
答案 7 :(得分:0)
虽然这是个老问题,但我想出了一个简单的解决方案。
var timeTaskInstance : TimerTask ?= null
val task: TimerTask = object : TimerTask() {
override fun run() {
timeTaskInstance = this
Log.e("TRACK_RECORDING_SERVICE", "Timer Running")
}
}
现在从任何地方取消计时器:
timeTaskInstance?.cancel()