gpt4 book ai didi

java - 如何在对话框关闭后停止预定的计时器

转载 作者:行者123 更新时间:2023-12-01 09:42:04 24 4
gpt4 key购买 nike

我有一个预定的计时器正在运行,以显示迟到的时间。每当学生到达学校时,都会打开一个自定义对话框,其中显示到达延迟:20.0 分钟。它每半分钟增加0.5min。我的代码是 -

public void startTimer(long delay_minutes) {
final long delay = delay_minutes;
delay_countup = (double) delay;

//Start the scheduled time
departuretimer = new Timer();
departuretimer.scheduleAtFixedRate(new TimerTask() {
public void run() {
countup = 0.0 + delay_countup;
Log.d("hi","Values 0" + delay_countup + countup);
mHandler.obtainMessage(1).sendToTarget();
delay_countup = delay_countup + 0.5;
Log.d("hi","Values 1" + delay_countup);
}
}, 0, 30000);
}

public Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
delay_time.setText(String.valueOf(countup) + "min");
rootView.invalidate();
}
};

问题是 -

a) 即使为新到达的学生打开对话框,计时器也会在后台为老到达的学生运行。我的意思是,当对话框关闭时,计时器永远不会被终止。(对话框关闭只是为了确认学生的到来)

b) 有时, TextView delay_time显示错误的值。它显示22.0min,然后立即显示0.5min,然后再次显示23.0min

这是为什么呢?

编辑 1:单击对话框中的按钮后处理计时器取消

private void handleClickAction() {
dismiss();
timer.cancel();
timer = null;
}

编辑2:日志始终显示正确的值,但在 UI 中有时会出现问题。问题是,例如 -

delay_countup = 50.0 
countup = 50.0
Textview updates as 50.0 //This is correct

Now,
delay_countup = 50.5
countup = 50.5
Textview updates as 0.5 //This is incorrect. I need 50.5

这种情况有时会发生...

最佳答案

看来您永远不会删除第一个计时器。因此,当您初始化第二个计时器时,您将有两个计时器同时尝试更新 UI。

将计时器存储为成员变量,并在启动第二个计时器之前检查它是否已初始化。当对话框关闭时,您应该cancel() Timer。所以你还应该看看如何实现方法 when the dialog is dismissed - 这应该调用一个清理方法,该方法 cancel() 并将计时器设置为 null。

public class DialogTest extends Dialog {

Timer timer;
double countup = 0;
double initial_time = 0;

public DialogTest(Context context){
super(context);

}


@Override
protected void onStart() {
super.onStart();

startUpCounting();
}

@Override
protected void onStop() {
Log.e("b", "timer stopped");
if(timer != null){
timer.cancel();
timer = null;
}

super.onStop();
}

public void startUpCounting() {
delay_for_student.setText("Delay in Arrival");
rootView.invalidate();
Log.e("b", "timer started");
if(timer != null){
timer.cancel();
timer = null;
}
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
countup = 0.0 + initial_time;
if (countup == 0.0) {
onTimeHandler.obtainMessage(1).sendToTarget();
} else {
mHandler.obtainMessage(1).sendToTarget();
}
initial_time = initial_time + 0.5;
}
}, 0, 1000);
}



public Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
Log.e("b", "timer: " + countup);
delay_time.setText(String.valueOf(countup) + "min");
rootView.invalidate();
}
};

public Handler onTimeHandler = new Handler() {
public void handleMessage(Message msg) {
Log.e("b", "timer ---");
delay_time.setText("-");
rootView.invalidate();
}
};
}

关于java - 如何在对话框关闭后停止预定的计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38376588/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com