2016-05-12 41 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