Android秒表落后了

时间:2014-07-04 17:35:15

标签: android

我已经制作了自己的秒表,可以在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;
}

}

1 个答案:

答案 0 :(得分:1)

制作计时器是一种可怕的方式。 Thread.sleep对准确性没有任何承诺 - 它只是意味着你至少睡不着那么多。如果你没有预定,它可以睡100倍。使用计时器,即使这样,你应该仔细检查当前时间。 Linux不是一个实时操作系统,并且没有承诺会立即发生计划的计时器。