Не сбрасывайте таймер после паузы/возобновления, когда он уже закончился (трудно объяснить)

Я новичок в java android. Я провел много исследований по SO, но не смог найти случай, который соответствует моему.

Я сделал игру для Android с разными таймерами. Я реализовал метод паузы/возобновления, он отлично работает, но большая проблема со вторым таймером: я бы хотел, чтобы этот таймер не возобновлялся в ответ на паузу, когда он уже завершен в цикле активности. Этот таймер соответствует действию персонажа в игре. Надеюсь, я хорошо объяснил (извините за мой английский, я француз). большое спасибо за твою помощь...

Мой НА ПАУЗЕ:

 protected void onPause() {
        super.onPause();
        MyMediaPlayer.getMediaPlayerInstance().stopAudioFile();
        SharedPreferences prefs = getSharedPreferences("X", MODE_PRIVATE);
        SharedPreferences.Editor editor = prefs.edit();
        editor.putString("lastActivity", getClass().getName());
        editor.commit();
        mCountDownTimer.cancel();
        mCountDownTimer = null;
        Timer2.cancel();
        Timer2 = null;
    }

Мое резюме:

 protected void onResume() {
        super.onResume();
        MyMediaPlayer.getMediaPlayerInstance().resumeAudio();
        if (mCountDownTimer == null) {
            mCountDownTimer = new CountDownTimer(mTimeRemaining, TIMER_INTERVAL) {
                @Override
                public void onTick(long millisUntilFinished) {
                    textView.setText(String.format(Locale.getDefault(), "%d sec.", millisUntilFinished / 1000L));
                    mTimeRemaining = millisUntilFinished;
                }

                @Override
                public void onFinish() {
                    Intent intent = new Intent(P39x.this, Lose15b.class);
                    Toast toast = Toast.makeText(P39x.this, "time has passed...\n" +
                            "\n" +
                            "YOU HAVE LOST !", Toast.LENGTH_LONG);
                    View toastView = toast.getView();
                    TextView toastMessage = (TextView) toastView.findViewById(android.R.id.message);
                    Typeface typeface = Typeface.createFromAsset(getAssets(), "SanvitoProLight.ttf");
                    toastMessage.setTypeface(typeface);
                    toastMessage.setTextSize(50);
                    toastMessage.setBackgroundResource(R.drawable.quiet);
                    toastMessage.setTextColor(Color.RED);
                    toastMessage.setGravity(Gravity.CENTER_VERTICAL);
                    toast.show();
                    getMediaPlayerInstance().stopAudioFile();
                    startActivity(intent);
                    finish();
                    MediaPlayer mediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.collapse);
                    mediaPlayer.start();
                }
            }.start();

            if (Timer2 == null) {
                Timer2 = new CountDownTimer(TIMERDURATION, TIMERINTERVAL) {
                    @Override
                    public void onTick(long millisUntilFinished) {
                        mTimeRemainin = millisUntilFinished;
                    }

                    @Override
                    public void onFinish() {
                        toast = Toast.makeText(P39x.this, "Find your way now", Toast.LENGTH_LONG);
                        View toastView = toast.getView();
                        TextView toastMessage = (TextView) toastView.findViewById(android.R.id.message);
                        Typeface typeface = Typeface.createFromAsset(getAssets(), "SanvitoProLight.ttf");
                        toastMessage.setTypeface(typeface);
                        toastMessage.setTextSize(40);
                        toastMessage.setBackgroundColor(Color.BLACK);
                        toastMessage.setTextColor(Color.MAGENTA);
                        toastMessage.setGravity(Gravity.CENTER_VERTICAL);
                        toast.show();
                    }
                }.start();

Я хотел бы, чтобы Timer2 не возобновлял работу взамен с паузы, когда она уже завершена в цикле активности.

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
0
24
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это проблема жизненного цикла, переместите timer2 в метод onCreate() вместо onResume, потому что onResume вызывается после того, как onPause() активен.

Ответ принят как подходящий

Если я правильно понимаю вашу проблему, вы хотите, чтобы второй таймер не перезапускался, если он уже завершил действие. Я думаю, что есть разные пути решения этой проблемы. Решением может быть реализация логической переменной, которая содержит информацию о том, должен ли таймер продолжать работу или нет.

Boolean startTimer = true;

В функции Timer2 onFinish() вы устанавливаете для этой переменной значение false

Timer2 = new CountDownTimer(...){
   ....
     @Override
     public void onFinish() {
      ....
      startTimer = false;
     }
                
                    

и в функции onResume() вы используете его:

protected void onResume(){
   ...
   if(startTimer){
       Timer2.start()
   }
}

Большое спасибо, я тестирую, ваш код работает, однако приложение вылетает в половине случаев во время onResume...

Lucien Le Martien 10.04.2022 14:25

Не могли бы вы показать мне сообщение об ошибке?

Mr T 10.04.2022 14:32

Это здорово, это работает, я удалил Timer2 = null; из onPause, вот что вызвало сбои (но я не понимаю, почему это привело к сбою приложения). Спасибо еще раз !

Lucien Le Martien 10.04.2022 15:08

Другие вопросы по теме