我有一个CountdownTimer,从60秒开始倒计时。 CountdownTimer的工作原理是将textView设置为剩余的毫秒数,但是每当我旋转设备时,CountdownTimer都会重置。
我知道发生这种情况是因为Activity轮流重新启动。因此,我尝试在重新启动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),但是我如何才能将数据从saveInstanceState保存到CountdownTimer?
07-06 20:21:30.038: D/Debug(28995): onCreate: 0
07-06 20:21:30.043: D/Debug(28995): onRestoreInstanceState(): 55994
最佳答案
我会给您的计时器它自己的线程。您的计时器正在停止,因为它位于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));
关于java - 轮播后恢复CountdownTimer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11368107/