繁体   English   中英

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

[英]Synchronization using System.currentTimeMillis() for timer schedule

我想在多个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()

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

将设备与毫秒级精度同步有很多问题:网络延迟,每个设备的日期不同,设备执行这些任务的延迟不同...我建议使用Tim的方法,但首先

  • 轮询设备2-3次以找出a)他们的网络延迟,b)他们的本地时间
  • 您要执行(播放长度为0的声音FE如果要播放声音)的虚拟任务轮询的设备,然后找出延迟
  • 根据以上所述,向每个设备发送自己的启动时间。

有不同的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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM