Android - “暂停”SystemClock计时器

时间:2013-03-06 23:05:41

标签: android

首先,这是我的代码:

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”应该做什么。我已经为此工作了大约三个小时,我仍然无法解决这个问题。

1 个答案:

答案 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是计时器运行的时间。