使用System.currentTimeMill的运行时间不适用于android

时间:2015-01-03 20:32:57

标签: java android

请问我在执行某些操作之间经历了一段时间。该代码用于在1分钟(60,000毫秒)之后执行操作但是当我在我的模拟器上运行代码时,经过的时间差通常小于预期,并且通常接近Thread.sleep()中的值。我已经尝试使用System.nanoTime()甚至SystemClock.uptimeMillis()...我在普通的java环境中做了类似的事情,它工作正常。问题可能来自模拟器,有没有办法做到这一点?

     long startTime=0;
     long elapsedTime=0;
     long totalTime = 0;

    @Override
    public void run() {
        // TODO Auto-generated method stub

        while (running) {

            startTime = System.currentTimeMillis();
            totalTime += elapsedTime;
            Log.d("elapsed","displaying time...."+elapsedTime);

            if(totalTime > 60000){
                Log.d("mins","one mins gone");
                totalTime = 0;
            }

              // do some other things here

         try {
            Thread.sleep(9000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


            elapsedTime = System.currentTimeMillis() - startTime;

        }

    }

2 个答案:

答案 0 :(得分:0)

System.currentTimeMillis()应该有效。但是我不确定这是否适合您的情况。将线程置入睡眠状态并不是执行与时间相关的任务的最佳方式。

如果您使用的是5.0版,则可以使用JobScheduler API。

对于5.0以下的版本,请尝试使用AlarmManager一次或重复发出警报。

    AlarmManager alarm=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(context, _YOURBroadcastReceiver.class);
    intent.putExtra(ONE_TIME, Boolean.FALSE);
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
    alarm.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 9000 , pi);

你需要实现一个广播接收器,它将在时间被触发。

答案 1 :(得分:-1)

那是因为你在startTime循环中分配while,这意味着在循环的最后一次迭代中它被分配到那个时间,所以它将被计算为线程休眠只有你提到的时间。 你应该在循环之前分配它。