更改定时器计划scheduleAtFixedRate

4

我有一个TextView需要频繁更新时间,这个是正常工作的,但问题是我想根据不同的情况更改计划时间,但我无法更改计划时间。它仍然保持最初设置的时间。

private Long mPeriod = Long.parseLong("8000");

public void startTimer() {
    Logger.i("startTimer", "startTimer");

    stopTimer();
    mTimer = new Timer();
    mTimerTask = new TimerTask() {
        @Override
        public void run() {
            // postInvalidate();
            Logger.i("timer", "timer");
            Thread th = new Thread(new Runnable() {

                @Override
                public void run() {
                    Logger.i("thread", "thread");

                    Long ll = System.currentTimeMillis();

                    mRelativeTime = DateUtils.getRelativeTimeSpanString(
                            Long.parseLong(mText + ""), ll, 0);

                    Long diff = ll - Long.parseLong(mText + "");
                    // long diffSeconds = diff / 1000 % 60;
                    long diffMinutes = diff / (60 * 1000) % 60;
                    long diffHours = diff / (60 * 60 * 1000) % 60;

                    Logger.d("diffMinutes", diffMinutes + "");
                    Logger.d("diffHours", diffHours + "");
                    if (diffMinutes == 0 && diffHours == 0) {
                        Logger.i("5000", "5000");
                        mPeriod = Long.parseLong("5000");
                    } else if (diffMinutes < 60 && diffMinutes != 0
                            && diffHours == 0) {
                        Logger.i("30000", "30000");
                        mPeriod = Long.parseLong("30000");
                    } else if (diffHours > 0) {
                        Logger.i("600000", "600000");
                        mPeriod = Long.parseLong("600000");
                    }
                    **// This line is not working...
                    mTimer.scheduleAtFixedRate(mTimerTask, 0, mPeriod);**
                    // Change text
                    handler.sendEmptyMessage(0);

                }
            });
            th.run();
        }
    };
    mTimer.scheduleAtFixedRate(mTimerTask, 0, mPeriod);
}

public void stopTimer() {

    if (mTimer != null) {
        mTimer.cancel();
        mTimer = null;
    }

}
2个回答

3
你需要创建一个自定义的CustomTimerTask类,该类继承自TimerTask。之后,你可以使用mCustomTimerTask(CustomTimerTask对象)来重新调度时间。 这里是答案,可能会有重复。

这是一个重复的问题,而且被同一个人回答了 :P - Ali Imran
这不是重复的问题。我想在TimerTask中重新安排我的计时器,因为它像递归一样处理,因为它在重新安排后启动TimerTask。 - Atif Mahmood

2
我已经解决了我的问题。只需检查之前的延迟,下面是解决方案。
private Long mPeriod = Long.parseLong("8000");

public void startTimer() {

Logger.i("startTimer", "startTimer");

stopTimer();
mTimer = new Timer();
mTimerTask = new TimerTask() {
    @Override
    public void run() {
        // postInvalidate();
        Logger.i("timer", "timer");
        Thread th = new Thread(new Runnable() {

            @Override
            public void run() {
                Logger.i("thread", "thread");

                Long ll = System.currentTimeMillis();

                mRelativeTime = DateUtils.getRelativeTimeSpanString(
                        Long.parseLong(mText + ""), ll, 0);

                Long diff = ll - Long.parseLong(mText + "");
                // long diffSeconds = diff / 1000 % 60;
                long diffMinutes = diff / (60 * 1000) % 60;
                long diffHours = diff / (60 * 60 * 1000) % 60;

                Logger.d("diffMinutes", diffMinutes + "");
                Logger.d("diffHours", diffHours + "");
                if (diffMinutes == 0 && diffHours == 0 && mTimerTask != 5000) {
                    Logger.i("5000", "5000");
                    mPeriod = Long.parseLong("5000");
                    startTimer();
                } else if (diffMinutes < 60 && diffMinutes != 0
                        && diffHours == 0 && mTimerTask != 30000) {
                    Logger.i("30000", "30000");
                    mPeriod = Long.parseLong("30000");
                    startTimer();
                } else if (diffHours > 0 && mTimerTask != 600000) {
                    Logger.i("600000", "600000");
                    mPeriod = Long.parseLong("600000");
                    startTimer();
                }

                // Change text
                handler.sendEmptyMessage(0);

            }
        });
        th.run();
    }
};
mTimer.scheduleAtFixedRate(mTimerTask, 0, mPeriod);
}

public void stopTimer() {
if (mTimer != null) {
    mTimer.cancel();
    mTimer = null;
}

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接