CountDownTimer默认构造函数采用值millisInFuture和countDownInterval。 如果用户停止计时器,将其设置更改为不同的millisInFuture长度,我将如何更改millisInFuture值而不创建新的CountDownTimer对象?
我尝试在覆盖CountDownTimer类中创建一个getMillisInFuture方法无济于事。 我是否必须覆盖onStart方法,或者什么?
答案 0 :(得分:5)
本课程不会让你自己做很多事情。
您可以创建一个包含CountDownTimer timer
字段的类和隐藏实现的方法update(time, tick)
。您仍然需要调用timer.cancel()
并使用新值创建新的CountDownTimer
。要么是这样,要么使用Handler
和postDelayed(...)
在我的回答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