2014-04-10 21 views
1

我想跨多个Android设备同步操作。为此,我有一个telnet客户端,可以将消息发送给他们。使用System.currentTimeMillis()进行定时器调度的同步

目前我发送消息像DoWork On 1397131360435到设备。你可以注意到最后一个参数是时间戳。

在我的代码的那一刻我计算给定的参数之间的时间差,并使用TimerTask叫我想方法。

但是,这并不工作,完全像我想的,因为网络延迟的影响,并且该命令到达装置的时间有点不同,导致设备之间的延迟几毫秒。

有没有一种方法可以等待特定的时间戳,然后运行我想要的方法?

目前,我这样做:

msDelay = Long.parseLong(args.get(2)) - System.currentTimeMillis(); 

       //inside a listener 
       new java.util.Timer().schedule(
         new java.util.TimerTask() { 
          @Override 
          public void run() { 
           mySyncMethod(); 

          } 
         }, 
         msDelay 
       ); 

所以,我的意思是,我要运行mySincMethod的时间戳时1397131360435 ....不仅仅是其与当地System.currentTimeMillis()

+0

计算当前时间和给定时间戳,并使用该差作为在定时器延迟之间的差。 –

+0

@Tim多数民众赞成我现在正在做的......我发送这个命令到10设备,它在不同的时间到达这些设备... –

+0

有一个重写计时器,采取特定的日期对象的第一次执行。您可以将毫秒转换为日期并使用该版本。 –

回答

3

有差异是不同的Timer.schedule方法:

void schedule(TimerTask task, Date time) 
     Schedules the specified task for execution at the specified time. 

void schedule(TimerTask task, long delay) 
     Schedules the specified task for execution after the specified delay. 

您目前正在使用后者。要使它在指定的时间工作,您应该使用前者,将毫秒转换为日期。

您可以转换毫秒日期如下:

long millis = 123456780000; 
Calendar calendar = Calendar.getInstance(); 
calendar.setTimeInMillis(millis); 
Date date = calendar.getTime(); 
+0

我试图用'指明MyDate =新的日期(args.get(2));'但是编译器说,这种方法已被弃用 –

+0

是的,它已经过时了。我添加了一个合法方式的例子。 –

3

有道是:带有时钟的人知道时间;一个有两个时钟的男人是永远不确定的...

有许多问题同步deveices与milisecond accurracy:网络延迟,不同的每个设备的日期,设备不同延迟启动这些任务...我建议使用Tim的方法,但首先

  • 民调显示设备的2-3倍,找出一)他们的网络延迟,b)它们的本地时间
  • 调查与您要执行一个伪任务的装置(播放0长度的声音如果你想播放声音),并找出延迟
  • 根据以上情况发送给每个设备自己的时间开始。