计时器计划方法超过了时间

时间:2013-01-22 19:13:48

标签: java android

我使用计时器计划方法每5分钟向db发送一次位置信息。

以下是代码:

public void onStart(Intent intent, int startId) 
{
    this.timer.schedule(new Send(), new Date(), TEN_SECONDS*6*5); //ten_seconds = 10000
}

class Send extends TimerTask
{
    public void run()
    {
        String address = LocationService.this.address;
        new SendLocation(LocationService.this.id,address); // a thread that sends the info to the db
        LocationService.this.gpsLocation = null;
        LocationService.this.networkLocation = null;
    }
}

但是为什么我的数据库有7/6分钟差异的位置? sendLocation检查我要发送到数据库的位置是否与最后一个相同,如果为true则忽略其他位置发送的位置。

这意味着我的数据库中每个位置之间的差异应该是5分钟的跳跃。

2 个答案:

答案 0 :(得分:1)

关注Timer schedule方法的this链接。它明确地说:

  

为重复的固定延迟执行安排指定的任务,   从指定时间开始。随后的处决发生在   大约定期的间隔,以指定的时间间隔分开。

     

在固定延迟执行中,每次执行都是相对于   上次执行的实际执行时间。如果执行是   因任何原因而延迟(例如垃圾收集或其他背景   活动),随后的执行也会延迟。长期   运行时,执行频率一般会略低于   指定时期的倒数(假设系统时钟   底层Object.wait(long)是准确的。)

在您的代码中run的{​​{1}}方法可能需要超过5分钟来完成其任务,因为Send {{需要执行一些繁重的任务1}}。所以你的数据库的位置差异为7/6分钟。

答案 1 :(得分:0)

无法保证您的TimerTasks将在您提出要求时完全执行。来自Timer文档 -

  

每个计时器都有一个线程,在该线程上顺序执行任务。   当此线程忙于运行任务时,可以执行可运行的任务   延迟。

  

本课程不提供有关实时性质的保证   任务调度

当然,两分钟很长一段时间,所以其他地方可能会有延误。