Android计时器仅触发一次

时间:2013-01-03 18:53:42

标签: android timer

我有这个代码,我想尝试每小时发送一个电子邮件报告(在每个例子中每秒)。如果没有覆盖,请在一小时内再试一次。不知怎的,我设法在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);
    }

3 个答案:

答案 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方法,从而中断了定时器的重启。