我有这个代码,我想尝试每小时发送一个电子邮件报告(在每个例子中每秒)。如果没有覆盖,请在一小时内再试一次。不知怎的,我设法在sendUnsendedReports()中打破了计时器:它只触发一次。如果我删除对sendUnsendedReports()的调用,那么计时器工作正常。即使使用try-catch块,计时器也只会触发一次。请指教。
private void createAndScheduleSendReport() {
delayedSendTimer = new Timer();
delayedSendTimer.schedule(new TimerTask() {
@Override
public void run() {
Log.w("UrenRegistratie", "Try to send e-mail...");
try{
sendUnsendedReports();
}
catch(Exception e){
// added try catch block to be sure of uninterupted execution
}
Log.w("UrenRegistratie", "Mail scheduler goes to sleep.");
}
}, 0, 1000);
}
答案 0 :(得分:3)
似乎有时计时器不能正常运行。另一种方法是使用Handler
代替TimerTask
。
您可以像以下一样使用它:
private Handler handler = new Handler();
handler.postDelayed(runnable, 1000);
private Runnable runnable = new Runnable() {
@Override
public void run() {
try{
sendUnsendedReports();
}
catch(Exception e){
// added try catch block to be sure of uninterupted execution
}
/* and here comes the "trick" */
handler.postDelayed(this, 1000);
}
};
查看this link了解更多详情。 :)
答案 1 :(得分:2)
schedule()
,具体取决于您是希望任务执行一次还是定期执行。
仅执行一次任务:
timer.schedule(new TimerTask() {
@Override
public void run() {
}
}, 3000);
在3秒后每秒执行一次任务。
timer.schedule(new TimerTask() {
@Override
public void run() {
}
}, 3000, 1000);
更多示例用法可以在方法标题
中找到public void schedule(TimerTask task, Date when) {
// ...
}
public void schedule(TimerTask task, long delay) {
// ...
}
public void schedule(TimerTask task, long delay, long period) {
// ...
}
public void schedule(TimerTask task, Date when, long period) {
// ...
}
答案 2 :(得分:0)
显然你遇到异常并退出了Timer run方法,从而中断了定时器的重启。