我使用计时器计划方法每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分钟的跳跃。
答案 0 :(得分:1)
关注Timer
schedule
方法的this链接。它明确地说:
为重复的固定延迟执行安排指定的任务, 从指定时间开始。随后的处决发生在 大约定期的间隔,以指定的时间间隔分开。
在固定延迟执行中,每次执行都是相对于 上次执行的实际执行时间。如果执行是 因任何原因而延迟(例如垃圾收集或其他背景 活动),随后的执行也会延迟。长期 运行时,执行频率一般会略低于 指定时期的倒数(假设系统时钟 底层Object.wait(long)是准确的。)
在您的代码中run
的{{1}}方法可能需要超过5分钟来完成其任务,因为Send
{{需要执行一些繁重的任务1}}。所以你的数据库的位置差异为7/6分钟。
答案 1 :(得分:0)
无法保证您的TimerTasks
将在您提出要求时完全执行。来自Timer
文档 -
每个计时器都有一个线程,在该线程上顺序执行任务。 当此线程忙于运行任务时,可以执行可运行的任务 延迟。
和
本课程不提供有关实时性质的保证 任务调度
当然,两分钟很长一段时间,所以其他地方可能会有延误。