0

我使用计时器调度方法每 5 分钟向数据库发送一次位置信息。

这是代码:

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 检查我要发送到数据库的位置是否与最后一个相同,如果为真则忽略该位置,否则发送它。

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

4

2 回答 2

1

观看有关Method 的链接。Timer schedule它清楚地表明:

从指定时间开始,安排指定任务以重复固定延迟执行。随后的执行以大约固定的时间间隔进行,间隔指定的时间段。

在固定延迟执行中,每次执行都是相对于前一次执行的实际执行时间安排的。如果由于任何原因(例如垃圾收集或其他后台活动)延迟执行,则后续执行也会延迟。从长远来看,执行频率一般会略低于指定周期的倒数(假设系统时钟底层 Object.wait(long) 是准确的)。

在您的代码中runSend由于SendLocation Thread. 所以你的数据库有 7/6 分钟差异的位置。

于 2013-01-22T19:27:40.557 回答
0

无法保证您TimerTasks将在您请求时准确执行。从Timer文档——

每个计时器都有一个线程,任务在其上按顺序执行。当该线程忙于运行任务时,可运行的任务可能会出现延迟。

此类不保证任务调度的实时性

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

于 2013-01-22T19:27:49.183 回答