Android 每X秒执行一次并不精确

Android 每X秒执行一次并不精确,android,runnable,Android,Runnable,我正在测试一些东西,我想用以下代码打印执行时间: private Runnable runnerLog = new Runnable() { @Override public void run() { String timeStamp = new SimpleDateFormat("HH:mm:ss yyyy-dd-MM").format(Calendar.getInstance().getTi

我正在测试一些东西,我想用以下代码打印执行时间:

    private Runnable runnerLog = new Runnable() {       
        @Override
        public void run() {           

            String timeStamp = new SimpleDateFormat("HH:mm:ss yyyy-dd-MM").format(Calendar.getInstance().getTime());
            System.out.println("Current time: " + timeStamp);

            mHandlerLogger.postDelayed(runnerLog, mInterval);
        }};
结果应该是:

13:45:10 13:45:12 13:45:14 13:45:16 等等

但我注意到有时差异不是2秒,而是3秒:

13:45:10 13:45:12 13:45:15 13:45:17 13:45:19 13:45:21 13:45:24

出现这种情况的原因是什么?每X秒执行一次任务有更好的解决方案吗?

试试这个

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);
    Thread myThread = null;

    Runnable runnable = new CountDownRunner();
    myThread= new Thread(runnable);   
    myThread.start();

}

public void doWork() {
    runOnUiThread(new Runnable() {
        public void run() {
            try{
                TextView txtCurrentTime= (TextView)findViewById(R.id.lbltime);
                    Date dt = new Date();
                    int hours = dt.getHours();
                    int minutes = dt.getMinutes();
                    int seconds = dt.getSeconds();
                    String curTime = hours + ":" + minutes + ":" + seconds;
                    txtCurrentTime.setText(curTime);
            }catch (Exception e) {}
        }
    });
}


class CountDownRunner implements Runnable{
    // @Override
    public void run() {
            while(!Thread.currentThread().isInterrupted()){
                try {
                doWork();
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                }catch(Exception e){
                }
            }
    }
}
请试试这个:

private Handler myhandler ;
private long RETRY_TIME = xx; 
private long START_TIME = yy; 


//oncreate
myhandler= new Handler();
myhandler.postDelayed(myRunnable, START_TIME);


//your runnable class

private Runnable myRunnable = new Runnable() {
  public void run() { 
    //doing something      
 myhandler.postDelayed(myRunnable, RETRY_TIME);
 }
 };

我尝试了倒计时类和这个样本,结果是一样的。触发之间的间隔为3秒。在其中一个输出中,差值为2秒,约为4秒。其余的在3秒钟内基本相同。我正在开发一个应用程序,它每X秒生成一些日志,并随时间将值存储在文件中,因此在时间问题上拥有正确的数据非常重要;int seconds=c.get(日历秒);您能更具体地说明Calendar类的具体操作吗?看,这可能是个问题,因为我有两个Runnable,两个都是不同的东西。也许第一个会影响第二个…@Josef请看下面我的答案。。。同样的问题。开始时运行良好,但一段时间后,差值为4秒,然后继续正常运行,再次出现差值约4秒。。。我真的不知道是什么造成了错误时间的中断…你在x秒后做了什么?所以这就不同了,我是说cpu在做这项工作时会浪费时间?正如我之前写的,有两个可运行的。On runnable是一种激活方法,它通过OTG与连接的设备通信,读取并存储日期。第二个runnable每X秒运行一次,并从存储测量值的变量中获取值。第二个runnable非常关键,因为它不会在精确的时间间隔内触发。我完全不明白为什么会这样。