2014-04-10 65 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長度的聲音如果你想播放聲音),並找出延遲
  • 根據以上情況發送給每個設備自己的時間開始。