请问我在执行某些操作之间经历了一段时间。该代码用于在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;
}
}
答案 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
,这意味着在循环的最后一次迭代中它被分配到那个时间,所以它将被计算为线程休眠只有你提到的时间。
你应该在循环之前分配它。