我编写了一个 Activity,其中包含一些类似秒表的代码。它确实需要准确,问题是它逐渐落后于实时。这是问题代码的一个较小的示例:
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),我不明白为什么这会不同步?
我已经在模拟器和实际设备上对此进行了测试,结果相同。
编辑:时间结果是针对发布的代码,即即使没有“缓慢的操作”,尽管在这里完成工作似乎会加剧延迟
请不要只提供一些替代方法来实现相同的目标。我本身并不反对替代方案,我只是很想知道为什么这段代码不能按预期工作。谢谢!