Сохранение countTimer() при прерываниях (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 в saveInstanceState и запускать таймер в зависимости от saveInstanceState или есть более простое решение

Изменить: поэтому я обновил свой код, чтобы отразить то, что я спросил. Таким образом, я могу сохранить последнее состояние таймера при повороте телефона, но таймер все равно не останавливается, когда я открываю меню (приостанавливаю работу приложения).

 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();
        }

person Freshia    schedule 27.02.2017    source источник


Ответы (2)


CounDwonTimer mCountTimer;
int seconds = 0;

затем просто отмените mCountTimer в onPause и начните в `onResme'

 protected void onResume(){
   super.onReusme();

   mCountTimer = new CountDownTimer(seconds*1000,1000){
       //......record the seconds
   }
}

protected void onPause(){
    if(mCountTimer != null)
       mCountTimer.cancel();
}

если ваша активность будет разрушаться при повороте экрана, вам нужно onSaveInstanceState. в противном случае вам не нужен этот метод

person tesla1984    schedule 27.02.2017
comment
Это сработало, когда я поместил countTimer из onCreate в onResume. Я принимаю это как ответ. - person Freshia; 27.02.2017

Я надеюсь, что следующий код поможет вам,

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();
}
person sadat    schedule 27.02.2017
comment
Я должен использовать обработчик внутри onCreate, верно? и isAdded не используется. Что проверяет? - person Freshia; 27.02.2017
comment
это во фрагменте, поэтому я использовал isAdded, чтобы проверить, добавлен ли фрагмент в действие или нет. и да, вы запускаете счетчик в oncreate. - person sadat; 27.02.2017
comment
Я поддерживаю ваш ответ, но принимаю другой, поскольку он использует countTimer. Этот тоже работает - person Freshia; 27.02.2017