使用System.currentTimeMillis()同步计时器计划

时间:2014-04-10 12:09:34

标签: java android datetime scheduled-tasks

我希望在多个Android设备上同步动作。为此,我有一个telnet客户端,我可以向他们发送消息。

目前,我向设备发送了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()的差异

2 个答案:

答案 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();

答案 1 :(得分:3)

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

有很多问题可以同步到具有毫秒级别的设备:网络延迟,不同的设备日期,启动这些任务的设备的不同延迟......我建议使用Tim的方法,但首先

  • 对设备进行2-3次轮询,以找出a)网络延迟,b)当地时间
  • 使用您想要执行的虚拟任务轮询设备(如果您想播放声音,则播放0长度的声音),并找出 延迟
  • 根据上述内容向每个设备发送自己的开始时间。