我有一个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
答案 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