Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 倒计时表上的时间可以更新吗?_Android - Fatal编程技术网

Android 倒计时表上的时间可以更新吗?

Android 倒计时表上的时间可以更新吗?,android,Android,CountDownTimer默认构造函数接受值millisInFuture和countDownInterval。 如果用户停止计时器,将其设置更改为不同的MillsInFuture长度,我如何在不创建新的CountDownTimer对象的情况下更改MillsInFuture值 我尝试在override CountDownTimer类中创建一个getMillisInFuture方法,但没有成功。 我必须重写onStart方法吗?还是怎么办?这个类不允许您自己做很多事情 您可以创建一个类,该类包含一

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

我尝试在override CountDownTimer类中创建一个getMillisInFuture方法,但没有成功。
我必须重写onStart方法吗?还是怎么办?

这个类不允许您自己做很多事情

您可以创建一个类,该类包含一个
CountDownTimer
字段和一个隐藏实现的方法
update(time,tick)
。您仍然需要调用
timer.cancel()
并使用新值创建一个新的
CountDownTimer
。或者使用
处理程序和
postDelayed(…)


请看我答案中第二种方法的一个例子,这门课不会让你自己做太多事情

您可以创建一个类,该类包含一个
CountDownTimer
字段和一个隐藏实现的方法
update(time,tick)
。您仍然需要调用
timer.cancel()
并使用新值创建一个新的
CountDownTimer
。或者使用
处理程序和
postDelayed(…)


请看我答案中第二种方法的一个例子,我也需要它,下面是代码

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();
    }

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

public void updateTimer(int minutes){
    pCountDownTimer.updateMinutes(minutes);
}
更新后,计时器将继续运行。它还延续了已经过去的时间。 这意味着,如果时间最初设置为30分钟,10分钟后更新为45分钟,则剩余的倒计时时间将为35分钟

它是通过在调用update函数时重新创建一个新计时器来实现的。在onTick,已经过去的时间(更新之前)被计算到新的进度中

如果需要,只需更换,即可将其更改为ms而不是min

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


我也需要,这是密码

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();
    }

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

public void updateTimer(int minutes){
    pCountDownTimer.updateMinutes(minutes);
}
更新后,计时器将继续运行。它还延续了已经过去的时间。 这意味着,如果时间最初设置为30分钟,10分钟后更新为45分钟,则剩余的倒计时时间将为35分钟

它是通过在调用update函数时重新创建一个新计时器来实现的。在onTick,已经过去的时间(更新之前)被计算到新的进度中

如果需要,只需更换,即可将其更改为ms而不是min

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

postDelayed(..)解决方案仅在应用程序获得唤醒锁的情况下有效。否则,如果设备进入睡眠模式,倒计时将停止。但是,在倒计时运行时,获取唤醒锁会大幅增加用电量……postDelayed(..)解决方案只有在应用程序获取唤醒锁的情况下才能工作。否则,如果设备进入睡眠模式,倒计时将停止。但是,在倒计时运行时,获取唤醒锁会大大增加功耗。。。