可以更新CountDownTimer上的时间吗?

时间:2011-04-30 18:37:14

标签: android

CountDownTimer默认构造函数采用值millisInFuture和countDownInterval。 如果用户停止计时器,将其设置更改为不同的millisInFuture长度,我将如何更改millisInFuture值而不创建新的CountDownTimer对象?

我尝试在覆盖CountDownTimer类中创建一个getMillisInFuture方法无济于事。 我是否必须覆盖onStart方法,或者什么?

2 个答案:

答案 0 :(得分:5)

本课程不会让你自己做很多事情。

您可以创建一个包含CountDownTimer timer字段的类和隐藏实现的方法update(time, tick)。您仍然需要调用timer.cancel()并使用新值创建新的CountDownTimer。要么是这样,要么使用HandlerpostDelayed(...)

从头开始创建倒数计时器

在我的回答here

中查看第二种方法的示例

答案 1 :(得分:-1)

我也需要它,这是代码

public class DynamicCountdownTimer {

    private CountDownTimer timer = null;
    private double negativeBias = 0.00;
    private double addingBias = 0.00;
    private int minutes = 0;
    private int ticks = 0;
    private boolean supressFinish = false;

    public DynamicCountdownTimer(int minutes, int ticks){
        setTimer(minutes, ticks);
    }

    public void updateMinutes(int minutes){
        if (timer != null){
            this.supressFinish = true;
            this.timer.cancel();
            this.timer = null;
            this.minutes = minutes;
            this.addingBias = this.negativeBias + this.addingBias;
            setTimer(this.minutes, this.ticks);
            Start();
        }
    }

    public void setTimer(int minutes, int ticks){
        this.minutes = minutes;
        this.ticks = ticks;
        timer = new CountDownTimer((minutes * 60 * 1000), ticks) {
            @Override
            public void onTick(long l) {
                negativeBias = (minutes * 60 * 1000) - l;
                long calculatedTime = l - (long)addingBias;
                if (calculatedTime <= 0){
                    onFinish();
                }else{
                    callback.onTick(calculatedTime);
                }
            }

            @Override
            public void onFinish() {
                if (!supressFinish){
                    callback.onFinish();
                }
                supressFinish = false;
            }
        };
    }

    public void Start(){
        if (timer != null){
            timer.start();
        }
    }

    public void Cancel(){
        if (timer != null){
            timer.cancel();
        }
    }

    public DynamicCountdownCallback callback = null;

    public void setDynamicCountdownCallback(DynamicCountdownCallback c){
        callback = c;
    }


    public interface DynamicCountdownCallback {
        void onTick(long l);
        void onFinish();
    }

}

这里是使用方法:

DynamicCountdownTimer pCountDownTimer = null;

public void initializeTimer(int minutes){

    pCountDownTimer = new DynamicCountdownTimer(minutes, 1000);
    pCountDownTimer.setDynamicCountdownCallback(new DynamicCountdownTimer.DynamicCountdownCallback() {
        @Override
        public void onTick(long l) {
            double progress = (double)( l) / (double)(minutes * 60 * 1000);
        }

        @Override
        public void onFinish() {
            // do something
        }
    });
    pCountDownTimer.Start();
}

然后您可以像这样更新它:

public void updateTimer(int minutes){
    pCountDownTimer.updateMinutes(minutes);
}

更新后,计时器将继续运行。它还保留了已经过去的时间。 这意味着,如果时间最初设置为30分钟,而您在10分钟后将其更新为45分钟,则剩余的倒数时间将为35分钟。

它通过在调用更新函数时重新创建一个新的Timer来实现。然后在onTick上,将已过去的时间(更新之前)计入新进度。

只需替换即可将其更改为ms而不是min。

(double)(minutes * 60 * 1000) -> ms

然后

int minutes -> long ms