我有一个方法需要每分钟执行一次,但我需要在一分钟的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)。有人可以帮我吗?
答案 0 :(得分: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);
}