在零秒时启动处理程序线程

Start handler thread at zero seconds

我有一个方法需要每分钟执行一次,但我需要在一分钟的 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();
}

主要activity我有一个这样的电话:

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

但是,此调用发生在随机时间点,例如,不是在 14:12:00,而是在 14:12:41,我需要它恰好在 14:12:00 开始(小时:毫米:ss)。有人可以帮我解决这个问题吗?

当您调用 startRepeatingTask() 时,计算等待下一个 'Minute' 间隔(即 00 秒)所需的时间,并将初始 运行 延迟到那时。

未来的 运行 将延迟 60 秒(b/c 的 INTERVAL 延迟),因此它们将 运行 在 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);
}