【问题标题】:Synchronization using System.currentTimeMillis() for timer schedule使用 System.currentTimeMillis() 进行定时器调度的同步
【发布时间】:2014-05-24 03:14:45
【问题描述】:

我想跨多个 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
                );

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

【问题讨论】:

  • 计算当前时间与给定时间戳之间的差值,并将此差值用作 Timer 中的延迟。
  • @Tim 这就是我现在正在做的事情...我将此命令发送到 10 个设备,它会在不同时间到达这些设备...
  • 有一个重写的 Timer,它在第一次执行时采用特定的 Date 对象。您可以将毫秒转换为日期并使用该版本。

标签: java android datetime scheduled-tasks


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我尝试使用myDate = new Date(args.get(2)); 但编译器说此方法已弃用
    • 是的,它已被弃用。我添加了一个合法方式的例子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 2018-05-16
    相关资源
    最近更新 更多