在零秒启动处理程序线程

时间:2016-05-12 13:36:22

标签: android multithreading android-handler

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

1 个答案:

答案 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);
}