아래 나는 초당 한 번 '시계'레이블을 업데이트하는 스레드가 있습니다. 스레드가 600 (10 분)에 도달하면 타이머가 중지됩니다. 스레드는 매분 약 5 초 정도 걸립니다. 따라서 val
= 60 일 때 실제로 65 초가 경과했을 수 있습니다. 나는 midp를 사용하고 있는데, 나는이 일을 도와 줄 어떤 api도 소개 할 수 없다고 생각한다. 수업의 정확성을 어떻게 향상시킬 수 있습니까? 나는 그것을 감속시키는 것이 convertValToTimerString 메서드라고 생각한다. 현재 타이머 val을 분으로 변환하는 더 좋은 방법이있다 : java formatter apis를 사용하지 않고 초 형식을 사용 하는가?내 타이머 스레드의 정확도 향상
감사합니다,
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;
}
좋아, 내 타이머 라벨 upedate 할 때 지금은 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);
}
}
이 클래스는 타이머 라벨을 업데이트 - 공용 클래스 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";
}
}
감사를 구현합니다.
모두에게 도움을 주셔서 감사합니다.
내가 더 잘할 수있는 것에 대한 의견은 환영합니다. 바로 실행 가능한 상태가 immediatelly 실행을 보장하지 않는, 그것은 그냥 그것으로 돌아 오기 그 후
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();
제 질문이 업데이트되었습니다. 감사합니다. –
MVC 원칙을 적절하게 구현 한 것처럼 보입니다. 내가 언급해야 할 한 가지가 있습니다. 레이블을 업데이트하는 것이 단순히 정밀도와 관련하여 스레드와 타이머를 처리하는 방법을 찾는 방법이었던 것처럼 대답했습니다. 그러나 높은 시간 정밀도가 필요한 경우 (즉 정확한 시계가 실제로 필요한 경우), andersoj의 의견이 가장 좋습니다 ... 시스템 시계를 사용하십시오. –