首先,这是我的代码:
public class MyClass extends Activity {
private Runnable updateTask = new Runnable() {
public void run() {
now = SystemClock.uptimeMillis();
elapsed = duration - (now - mStart); //duration = 30000
if (elapsed > 0) {
seconds = (int) (elapsed / 1000);
minutes = seconds / 60;
seconds = seconds % 60;
mHandler.postAtTime(this, now + 1000);
}
else {
mHandler.removeCallbacks(this);
finish();
}
}
};
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mStart = SystemClock.uptimeMillis();
mHandler.post(updateTask);
this.pause.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(MyClass.this,NextActivity.class);
MyClass.this.startActivity(intent);
}
});
}
public void onStop(){
super.onStop();
mHandler.removeCallbacks(updateTask);
}
public void onRestart(){
super.onRestart();
mHandler.post(updateTask);
}
我缩短了代码,使其更容易阅读。计时器工作正常,计时器倒计时到零。我遇到的问题是,当我按下暂停按钮时,我正试图“暂停”计时器。暂停按钮实际上启动一个新活动,其中显示一个暂停屏幕,完全阻碍当前活动。现在我知道SystemClock没有暂停,所以我能做的最好就是在onStop()中删除运行计时器的线程(mHandler.removeCallbacks(updateTask)),然后再调用它在onRestart中再次启动。
问题是当onRestart()时,计时器显示为在暂停活动期间在后台运行。假设我暂停了25秒。如果我在暂停屏幕中持续5秒并返回主活动,则计时器现在将显示20秒,而不是像预期的那样显示25秒。我知道即使我在暂停屏幕,SystemClock仍在运行。我不知道如何操纵SystemClock值给我时间停止。
我在StackOverflow上借用了某人的定时器代码,我不知道“mStart”和“now”应该做什么。我已经为此工作了大约三个小时,我仍然无法解决这个问题。
答案 0 :(得分:1)
我遇到的问题是,当我按下暂停按钮时,我正试图“暂停”计时器。
没有直接暂停计时器的方法,但你可以取消它并更改mStart
以达到你想要的效果:
this.pause.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mHandler.removeCallbacks(updateTask);
// Start your pause screen
}
});
然后,当您想要恢复计时器更新mStart
时,请调整计算以删除任何已用时间。
protect void onResume() {
super.onResume();
// Move these here from onCreate()
mStart = SystemClock.uptimeMillis() - elapsed;
mHandler.post(updateTask);
}
<强>加成强>
这困扰我,可能是因为我累了:
elapsed = duration - (now - mStart);
if (elapsed > 0) {
因为对我来说它不如
直观elapsed = now - mStart;
if (elapsed < duration) {
但这只是我挑剔,使用对你最有意义的方法。
如果您使用:
elapsed = duration - (now - mStart);
然后正确的等式(如下所述)是:
mStart = SystemClock.uptimeMillis() + elapsed - duration
我不知道“mStart”和“now”应该做什么。
这两个变量用于计算计时器的运行时间。
now
现在。mStart
是计时器启动的时间。now - mStart
是计时器运行的时间。