在中断时保存 countTimer() (Android)
Saving countTimer() on interrupts (Android)
我正在创建一个游戏,我在 onCreate 方法中放置了一个计时器,以向用户显示时间并在时间为 0 时执行操作。我的方法工作正常,但自从我将其写入 onCreate 以来,时间继续倒计时如果我旋转屏幕等,它会重置计时器秒数。我知道为什么会发生这种情况,但我找不到在应用程序暂停时停止它并使其从应用程序继续时离开的地方继续的方法。这是我的代码
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();
我应该将 milisUntilFinished 保存到 savedInstanceState 并根据 savedInstanceState 启动计时器还是有更简单的解决方案
编辑:所以我更新了我的代码以反映我所问的事情。这样我可以在旋转phone时保存定时器的最后状态,但是当我打开菜单(暂停应用程序)时定时器仍然不会停止。
if(savedInstanceState!=null){
seconds = savedInstanceState.getInt("seconds");
new CountDownTimer(seconds * 1000, 1000) {
public void onTick(long millisUntilFinished) {
seconds = (int) millisUntilFinished;
question.setText("seconds remaining: " + millisUntilFinished / 1000);
}
public void onFinish() {
question.setText("done!");
Intent i2 = new Intent(getApplicationContext(), CategoryActivity.class);
startActivity(i2);
}
}.start();
}else {
new CountDownTimer(15000, 1000) {
public void onTick(long millisUntilFinished) {
seconds = (int) millisUntilFinished;
question.setText("seconds remaining: " + millisUntilFinished / 1000);
}
public void onFinish() {
question.setText("done!");
Intent i2 = new Intent(getApplicationContext(), CategoryActivity.class);
startActivity(i2);
}
}.start();
}
希望以下代码对您有所帮助,
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();
}
CounDwonTimer mCountTimer;
int seconds = 0;
然后只需取消 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();
}
如果你的activity在旋转屏幕的时候会销毁,你需要onSaveInstanceState
。否则你不需要这个方法
我正在创建一个游戏,我在 onCreate 方法中放置了一个计时器,以向用户显示时间并在时间为 0 时执行操作。我的方法工作正常,但自从我将其写入 onCreate 以来,时间继续倒计时如果我旋转屏幕等,它会重置计时器秒数。我知道为什么会发生这种情况,但我找不到在应用程序暂停时停止它并使其从应用程序继续时离开的地方继续的方法。这是我的代码
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();
我应该将 milisUntilFinished 保存到 savedInstanceState 并根据 savedInstanceState 启动计时器还是有更简单的解决方案
编辑:所以我更新了我的代码以反映我所问的事情。这样我可以在旋转phone时保存定时器的最后状态,但是当我打开菜单(暂停应用程序)时定时器仍然不会停止。
if(savedInstanceState!=null){
seconds = savedInstanceState.getInt("seconds");
new CountDownTimer(seconds * 1000, 1000) {
public void onTick(long millisUntilFinished) {
seconds = (int) millisUntilFinished;
question.setText("seconds remaining: " + millisUntilFinished / 1000);
}
public void onFinish() {
question.setText("done!");
Intent i2 = new Intent(getApplicationContext(), CategoryActivity.class);
startActivity(i2);
}
}.start();
}else {
new CountDownTimer(15000, 1000) {
public void onTick(long millisUntilFinished) {
seconds = (int) millisUntilFinished;
question.setText("seconds remaining: " + millisUntilFinished / 1000);
}
public void onFinish() {
question.setText("done!");
Intent i2 = new Intent(getApplicationContext(), CategoryActivity.class);
startActivity(i2);
}
}.start();
}
希望以下代码对您有所帮助,
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();
}
CounDwonTimer mCountTimer;
int seconds = 0;
然后只需取消 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();
}
如果你的activity在旋转屏幕的时候会销毁,你需要onSaveInstanceState
。否则你不需要这个方法