使用 System.currentTimeMillis() 进行定时器调度的同步

Sae*_*ani 1 java datetime android scheduled-tasks

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

目前我向DoWork On 1397131360435设备发送了一条消息。如您所见,最后一个参数是时间戳。

在我的代码中,我计算给定参数之间的时间差并使用 aTimerTask来调用我想要的方法。

但这并不像我想要的那样工作,因为网络延迟的影响,并且此命令到达设备的时间有点不同,这会导致设备之间出现几毫秒的延迟。

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

目前我喜欢这样:

 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
                );
Run Code Online (Sandbox Code Playgroud)

所以我的意思是,我想mySincMethod在时间戳为1397131360435.... 不仅仅是它与本地的区别时运行System.currentTimeMillis()

Tas*_*kos 5

有句话说得好:有钟的人知道时间;一个有两个时钟的人永远是不确定的......

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

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