2016-05-12 36 views
0

我有一種方法需要每分鐘執行一次,但我需要在一分鐘(在手錶上)的00秒處啓動此線程,因爲它會根據時間更新屏幕。在零秒處啓動處理程序線程

我的處理程序代碼是在這裏:

//update bottom card every minute 
private final static int INTERVAL = 1000 * 60; //1 minute 
Handler mHandler = new Handler(); 

Runnable mHandlerTask = new Runnable() 
{ 
    @Override 
    public void run() { 
     updateBottomCard(); 
     mHandler.postDelayed(mHandlerTask, INTERVAL); 
    } 
}; 

public void startRepeatingTask(ArrayList<Meeting> meetingsOfToday) 
{ 
    this.meetingsOfToday = meetingsOfToday; 
    mHandlerTask.run(); 
} 

在主要活動我有這樣一個電話:

BottomCardController.getInstance(this).startRepeatingTask(meetingsSorted.get(TODAY_INDEX)); 

然而,這個調用發生在任意時間點,例如不是在14:12:00 - 而是在14:12:41,而我需要在14:12:00(hh:mm:ss)開始。任何人都可以幫助我嗎?

回答

3

當您致電startRepeatingTask()計算等到下一個「分鐘」間隔(即00秒)所需的時間並延遲初始運行時間。

未來運行將延遲60秒(您的INTERVAL延遲的b/c),因此它們將在00標記上運行。

public static long getNextMinuteTimestamp(){ 
     long timeInMillis = System.currentTimeMillis(); 
     double timeInSec = timeInMillis/1000.0; 
     double timeInMin = timeInSec/60.0; 
     return ((long) Math.ceil(timeInMin)) * 60 * 1000; 
    } 

public void startRepeatingTask(ArrayList<Meeting> meetingsOfToday) 
{ 
    this.meetingsOfToday = meetingsOfToday; 
    long delayAmt = getNextMinuteTimestamp() - System.currentTimeMillis(); 
    mHandler.postDelayed(mHandlerTask, delayAmt); 
} 
+0

也許是一個例子,但總的來說,這似乎是解決方案。 – zgc7009

+0

@ zgc7009示例將意味着使用數學lol ... – Shmuel

+0

您的答案表示Java/Android中的功能,甚至沒有在問題中顯示過。舉一個例子來說明如何才能真正把時間花在下一分鐘,並造成延誤,這將是一個完整的答案。是的......這需要一些數學。 – zgc7009