我已经制作了自己的秒表,可以在Android设备上运行,但它似乎运行良好但是在大约15-20秒之后,与其他计时器相比时会出现明显的延迟。我一直在S4 mini上运行它,它使用21%的CPU,1%的内存,并且有4个活动的线程在整个时间运行,所以我真的看不到任何东西。
public void onClick(View v){
if(v == start)
{
started = true;
reset.setClickable(false);
task();
}
else if(v == stop){
started = false;
reset.setClickable(true);
}
else if(v == reset){
timer = new Clock();
hour.setText(Integer.toString(timer.getHour()));
minute.setText(Integer.toString(timer.getMinute()));
second.setText(Integer.toString(timer.getSecond()));
milli.setText(Integer.toString(timer.getMilli()));
}
}
public void task(){
new Thread(new Runnable(){
public void run(){
while(started){
try{
timer.tick();
layout.post(new Runnable(){
public void run(){
MainActivity.hour.setText(Integer.toString(timer.getHour()));
MainActivity.minute.setText(Integer.toString(timer.getMinute()));
MainActivity.second.setText(Integer.toString(timer.getSecond()));
MainActivity.milli.setText(Integer.toString(timer.getMilli()));
Log.v("thread", Integer.toString(Thread.activeCount()));
}
});
Thread.sleep(10);
}
catch(Exception e){
}
}
}
}).start();
}
这是Clock类的内容
public class Clock {
private int hour;
private int minute;
private int second;
private int milli;
Clock(int h, int m, int s, int mm) {
hour = h;
minute = m;
second = s;
milli = m;
}
Clock() {
hour = 0;
minute = 0;
second = 0;
milli = 0;
}
public void tick() {
if (milli == 99) {
milli = 0;
if (second == 59) {
second = 0;
if (minute == 59) {
minute = 0;
if (hour == 23) {
hour = 0;
} else {
hour++;
}
} else {
minute++;
}
} else {
second++;
}
} else {
milli++;
}
}
public int getHour() {
return hour;
}
public int getMinute() {
return minute;
}
public int getSecond() {
return second;
}
public int getMilli() {
return milli;
}
}
答案 0 :(得分:1)
制作计时器是一种可怕的方式。 Thread.sleep对准确性没有任何承诺 - 它只是意味着你至少睡不着那么多。如果你没有预定,它可以睡100倍。使用计时器,即使这样,你应该仔细检查当前时间。 Linux不是一个实时操作系统,并且没有承诺会立即发生计划的计时器。