我写了一个包含一些类似秒表的代码的活动。它确实需要准确,问题是它逐渐落后于实时。以下是问题代码的较小示例:
import java.util.Date;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Menu;
public class MainActivity extends Activity {
public static final int TIME_STEP = 500; // milliseconds between updates
private Handler mHandler = new Handler();
private long mTimeElapsed = 0;
private Runnable mUpdateTimeTask = new Runnable()
{
private long mOldTime = 0; // previous real time (ms) that run() was called
public void run()
{
mHandler.postDelayed(mUpdateTimeTask, TIME_STEP);
long currentTime = new Date().getTime();
long realDelay = currentTime - mOldTime; // the actual delay between successive calls to run()
if (mOldTime != 0)
mTimeElapsed += realDelay;
Log.d(this.toString(), "time elapsed = " + mTimeElapsed/1000);
// some slow operations here...
mOldTime = currentTime;
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTimeElapsed = 0;
mHandler.removeCallbacks(mUpdateTimeTask);
mHandler.postDelayed(mUpdateTimeTask, 0);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
为了说明问题:在运行应用程序8:23后(根据logcat时间戳)mTimeElapsed将是456秒,或7:36。
由于连续调用run()之间的延迟是使用getTime()计算的(即它不假设真正的延迟是TIME_STEP),我无法理解为什么它会失去同步?
我在模拟器和具有相同结果的实际设备上进行了测试。
编辑:时间结果是发布的代码I.e.即使没有“缓慢的操作”,虽然在这里完成工作确实似乎加剧了延迟
请不要只提供一些实现相同目标的替代方法。我不反对替代品本身,我真的很想知道为什么这段代码没有按预期工作。谢谢!
答案 0 :(得分:2)
目前还不清楚,如果没有更多的代码,您的时间计算和其他方法会发生什么。但是,看起来很清楚的是,您的方法似乎没有正确地测量经过的时间。
从我所看到的,“经过的时间”由run()调用之间的延迟组成。这不等于从程序开始起经过的时间,因为我假设这些点之间发生了很多小事情,这些因素会导致这种累积损失的时间。有没有理由你不是简单地检索一个开始时间然后只计算当前时间和开始时间之间的差异?
答案 1 :(得分:0)
几点说明:
a)目前尚不清楚你究竟在mTimeElapsed中计算出什么?您是否尝试计算活动的总时间?您是否尝试计算在run()中花费的总时间(大约等于“一些慢速操作”花费的时间)?您是否尝试计算在run()之外花费的总时间?
b)根据你的代码,你要做的是计算BETWEEN从run()退出和下一次run()执行所花费的时间(大约)(运行时间outide)。这是你需要的吗?