轮换后恢复CountdownTimer

时间:2012-07-06 18:56:18

标签: java android countdowntimer

我有一个CountdownTimer从60秒倒计时。这个CountdownTimer的工作原理是将textView设置为剩余的毫秒数,但每当我旋转设备时,CountdownTimer都会重置。

我知道这是因为Activity在轮换时重新启动。所以我尝试在活动重新启动后保存捆绑包中的剩余时间然后恢复它。

long transferValue;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_playtimemode);

    Log.d("Debug", "onCreate: " + transferValue);

    long setTime = 60000;
    long difference = setTime - transferValue;

    new CountDownTimer(difference, 1000) {

        public void onTick(long millisUntilFinished) {
            millisUntilFinishedToSave = millisUntilFinished;
            tvCountdown.setText("" + millisUntilFinished / 1000);
        }

        public void onFinish() {
            tvCountdown.setText("done!");
        }
    }.start();

}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putLong("millisKey", millisUntilFinishedToSave);

}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    transferValue = savedInstanceState.getLong("millisKey");
    Log.d("Debug", "onRestoreInstanceState(): " + transferValue);
}

然而,这不起作用。我正在这个代码的顶部初始化transferValue(因此它返回0),但我怎么能将来自savedInstanceState的数据保存到CountdownTimer?

07-06 20:21:30.038: D/Debug(28995): onCreate: 0
07-06 20:21:30.043: D/Debug(28995): onRestoreInstanceState(): 55994

3 个答案:

答案 0 :(得分:4)

我会给你的计时器它自己的线程。您的计时器正在停止,因为它位于UI线程上(如您所述),并且当重绘UI时,重新初始化Activity。所有长时间运行的进程都应该有自己的线程。经验法则:尽快退出UI线程。

以下是使用服务的示例。无论屏幕方向改变甚至活动焦点发生变化,此服务都会在被调用时启动并保留在内存中。

这是服务:

public class Timer extends Service {

    @Override
    public IBinder onBind(Intent i) {
        return null;
    }
    @Override
    public int onStartCommand(Intent i, int flags, int startId) {
        // Put your timer code here
    }
}

您需要将此行添加到清单(应用程序打开/关闭标记之间):

<service android:name=".Timer" />

然后你可以随时使用它来启动服务(重要的是要注意你可以一遍又一遍地启动它,递归调用不会提供新服务。):

startService(new Intent(this, Timer.class));

答案 1 :(得分:2)

使用System.currentTimeMillis获取当前系统时间,然后将60000毫秒添加到时间并将其存储为结束时间。然后,只要你需要改变任何东西,只需将System.currentTimeMillis与EndTime进行比较。

Endtime = System.currentTimeMillis + 60000;

然后在每个实例上

TimeRemaining = Endtime - System.currentTimeMillis

答案 2 :(得分:0)

接受的答案使事情变得非常复杂。你可以用更简单的方式做到这一点。您的代码中的问题是Activity在轮换时创建(请参阅活动生命周期),CountdownTimer实例也是如此。

我可以编写完整的示例代码,但@Drew在这里有一个很好的答案:Android Innerclass TextView reference when activity resumes