0

首先,这是我的代码:

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”应该做什么。我已经为此工作了大约三个小时,但我仍然无法弄清楚。

4

1 回答 1

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是计时器运行了多长时间。
于 2013-03-06T23:10:59.443 回答