在中断时保存countTimer()(Android)
我正在创建一个游戏,我将一个计时器设置为onCreate方法,以向用户显示时间,并在时间达到0时执行操作。我的方法工作正常,但因为我写了一次,时间继续倒计时,如果我旋转屏幕等,它重置计时器秒。我知道为什么会发生这种情况,但我找不到一种方法在应用程序暂停时停止它,并在应用程序继续时使它从离开的位置继续。这是我的密码在中断时保存countTimer()(Android),android,android-studio,timer,oncreate,Android,Android Studio,Timer,Oncreate,我正在创建一个游戏,我将一个计时器设置为onCreate方法,以向用户显示时间,并在时间达到0时执行操作。我的方法工作正常,但因为我写了一次,时间继续倒计时,如果我旋转屏幕等,它重置计时器秒。我知道为什么会发生这种情况,但我找不到一种方法在应用程序暂停时停止它,并在应用程序继续时使它从离开的位置继续。这是我的密码 new CountDownTimer(15000, 1000) { public void onTick(long millisUntilFinished)
new CountDownTimer(15000, 1000) {
public void onTick(long millisUntilFinished) {
question.setText("seconds remaining: " + millisUntilFinished / 1000);
}
public void onFinish() {
question.setText("done!");
Intent i2 = new Intent(getApplicationContext(), CategoryActivity.class);
startActivity(i2);
}
}.start();
我应该将milisuntiltfinished保存到savedInstanceState并根据savedInstanceState启动计时器,还是有更简单的解决方案
编辑:所以我更新了我的代码,以反映我的要求。这样,当手机旋转时,我可以保存定时器的最后状态,但当我打开菜单时,定时器仍然不会停止(暂停应用程序)
我希望下面的代码可以帮助您
private long startTime = 0L;
private boolean threadStop = false;
private Handler myHandler = new Handler();
private Runnable updateTimerMethod = new Runnable() {
public void run() {
if (isAdded()) {
timeInMillies = SystemClock.uptimeMillis() - startTime;
//finalTime = timeSwap + timeInMillies;
time.setText(miliSecondToMinSec(timeInMillies));
if (!threadStop)
myHandler.postDelayed(this, 1000);
}
}
};
@Override
public void onStart() {
super.onStart();
if (threadStop) {
threadStop = false;
startTime = SystemClock.uptimeMillis() - timeInMillies;
myHandler.postDelayed(updateTimerMethod, 0);
}
}
@Override
public void onStop() {
threadStop = true;
super.onStop();
}
然后只需取消onPause
中的mCountTimer
,并从“onResme”开始
protected void onResume(){
super.onReusme();
mCountTimer = new CountDownTimer(seconds*1000,1000){
//......record the seconds
}
}
protected void onPause(){
if(mCountTimer != null)
mCountTimer.cancel();
}
如果在旋转屏幕时您的活动将破坏,则需要
onSaveInstanceState
。否则您不需要此方法我应该使用onCreate中的处理程序,对吗?而isAdded是未使用的。它检查什么?它在片段中,这就是为什么我使用isAdded检查片段是否添加到活动中。是的,你在oncreate中启动countr。我支持你的答案,但接受另一个,因为它使用countTimer。当我将countTimer从onCreate设置为onResume时,它也可以工作。我接受这个答案。
CounDwonTimer mCountTimer;
int seconds = 0;
protected void onResume(){
super.onReusme();
mCountTimer = new CountDownTimer(seconds*1000,1000){
//......record the seconds
}
}
protected void onPause(){
if(mCountTimer != null)
mCountTimer.cancel();
}