gpt4 book ai didi

java - 提高我的计时器线程的准确性

转载 作者:行者123 更新时间:2023-11-29 10:06:55 25 4
gpt4 key购买 nike

下面我有一个每秒更新一次“时钟”标签的线程。一旦线程达到 600(10 分钟),计时器就会停止。线程似乎每分钟拖尾大约五秒钟。所以当 val = 60 时,实际上可能已经过去了 65 秒。我正在使用 midp,所以我认为我无法引入任何 api 来帮助我完成这项任务。我怎样才能提高类(class)以下的准确性?我认为让它变慢的是方法 convertValToTimerString,是否有更好的方法将当前计时器 val 转换为分钟:秒格式而不使用 java 格式化程序 api?

谢谢,

public class LabelTimerUpdaterThread implements Runnable{

public static int val = 0;
private int minuteValueInt = 0;
private int secondValueInt = 0;
private int tempSecondValueInt;
public boolean isRunning = true;

public LabelTimerUpdaterThread(){

}

public void run() {
while(isRunning){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
val += 1;


incrementTimer();

if(val == 600){
break;
}
}
}

private void incrementTimer(){
Screen.timerLabel.setText(convertValToTimerString(val));
}

private String convertValToTimerString(int val){

String minuteValString = "";
String secondValString = "";

if(val < 10){
minuteValString = "00";
secondValString = "0"+String.valueOf(val);
return minuteValString+":"+secondValString;
}

if(val < 60){
minuteValString = "00";
secondValString = String.valueOf(val);
return minuteValString+":"+secondValString;
}

if(val % 60 == 0){
++minuteValueInt;
}

if(minuteValueInt < 10){
minuteValString = "0"+String.valueOf(minuteValueInt);
int secondVal = val % 60;
if(secondVal < 10){
return minuteValString+":0"+String.valueOf(secondVal);
}
else {
return minuteValString+":"+String.valueOf(secondVal);
}
}

return "10:00";
}

public void stopThread(){
this.isRunning = false;
}

好的,现在我在尝试更新计时器标签时收到 IllegalStateException - 这是我的代码-

我在这里实例化我的标签 -

timerLabel = new CustomLabelField("00:00" , Field.FIELD_LEFT , Constants.SMALL_FONT , Color.BLACK, Bitmap.getBitmapResource("bg_clock_white.png"));

UpdateValTimer timer = new UpdateValTimer(th);
timer.startTimer();

此类创建计时器类并创建将更新计时器标签的类。

public class UpdateValTimer {

private Timer timer;
private int val = 0;
private UpdateView uv;
private final CustomLabelField customLabelField;

public UpdateValTimer(CustomLabelField field) {
this.customLabelField = field;
}

public void startTimer(){
timer = new Timer();
uv = new UpdateView(customLabelField);
Thread t = new Thread(uv);
t.start();

timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
++val;
}
}, 1000, 1000);
}
}

这个类更新定时器标签 - 公共(public)类 UpdateView 实现 Runnable{

    private int val = 0;
private int minuteValueInt = 0;
private final CustomLabelField timerLabel;

public UpdateView(CustomLabelField timerLabel) {
this.timerLabel = timerLabel;
}

public void run() {
while(true){
this.timerLabel.setText(convertValToTimerString(this.val));
}
}

private String convertValToTimerString(int val){

String minuteValString = "";
String secondValString = "";

if(val < 10){
minuteValString = "00";
secondValString = "0"+String.valueOf(val);
return minuteValString+":"+secondValString;
}

if(val < 60){
minuteValString = "00";
secondValString = String.valueOf(val);
return minuteValString+":"+secondValString;
}

if(val % 60 == 0){
++minuteValueInt;
}

if(minuteValueInt < 10){
minuteValString = "0"+String.valueOf(minuteValueInt);
int secondVal = val % 60;
if(secondVal < 10){
return minuteValString+":0"+String.valueOf(secondVal);
}
else {
return minuteValString+":"+String.valueOf(secondVal);
}
}

return "10:00";
}

}

感谢您的帮助

经过一些初步测试后,此代码似乎可以正常工作。

感谢大家的帮助。

欢迎对我可以做得更好的任何意见。

public class UpdateValTimer{

private int minuteValueInt = 0;
private Timer timer;
private int val = 0;
private UpdateView uv;
private CustomLabelField customLabelField;

public UpdateValTimer(CustomLabelField field) {
this.customLabelField = field;
}

public void startTimer(){
timer = new Timer();
uv = new UpdateView(customLabelField);
Thread t = new Thread(uv);
t.start();

timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
++val;
uv.setVal(convertValToTimerString(val));
}
}, 1000, 1000);


}

private String convertValToTimerString(int val){

String minuteValString = "";
String secondValString = "";

if(val < 10){
minuteValString = "00";
secondValString = "0"+String.valueOf(val);
return minuteValString+":"+secondValString;
}

if(val < 60){
minuteValString = "00";
secondValString = String.valueOf(val);
return minuteValString+":"+secondValString;
}

if(val % 60 == 0){
++minuteValueInt;
}

if(minuteValueInt < 10){
minuteValString = "0"+String.valueOf(minuteValueInt);
int secondVal = val % 60;
if(secondVal < 10){
return minuteValString+":0"+String.valueOf(secondVal);
}
else {
return minuteValString+":"+String.valueOf(secondVal);
}
}

return "10:00";
}
}


public class UpdateView implements Runnable{

private String timeElapsedCounter;
private final CustomLabelField timerLabel;

public UpdateView(CustomLabelField timerLabel) {
this.timerLabel = timerLabel;
}

public void setVal(String timeElapsedCounter){
this.timeElapsedCounter = timeElapsedCounter;
}

public void run() {

while(true){
synchronized(Application.getEventLock()){
timerLabel.setText(this.timeElapsedCounter);
}
}
}

}


timerLabel = new CustomLabelField("00:00" , Field.FIELD_LEFT , Constants.SMALL_FONT , Color.BLACK, Bitmap.getBitmapResource("bg_clock_white.png"));

UpdateValTimer timer = new UpdateValTimer(timerLabel);
timer.startTimer();

最佳答案

Thread.sleep(1000);

将线程置于 hibernate 状态 至少 1 秒,然后返回到准备运行状态,这不保证它会立即运行,它只是“准备就绪”安排在未来的任何时间运行”。何时运行它取决于线程调度程序。例如,您可能想要检查系统时间以真正了解经过了多少时间......

关于java - 提高我的计时器线程的准确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5183318/

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