Отмена таймера обратного отсчета вызывает сбой приложения при нажатии кнопки - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь создать countDownTimer , но всякий раз, когда я нажимаю кнопку, приложение вылетает. Я хочу, чтобы, если я нажму на кнопку player1 обратный отсчет player2 должен приостановиться, и наоборот для player2 .

Ошибка Я получение:

Попытка вызвать виртуальный метод void android .os.CountDownTimer.cancel () для ссылки на нулевой объект

Вот код

public class Timer extends AppCompatActivity {

    Button player1, player2;
    long incrementTime = 3000;
    int time;
    long timeinLong;
    ImageButton pause;
    CountDownTimer player1count, player2count;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_timer);

        player1 = findViewById(R.id.player1);
        player2 = findViewById(R.id.player2);

        Intent intent = getIntent();
        time = intent.getIntExtra("time", 0);
        timeinLong = time * 60000;

        int minutes = (int) (timeinLong / 1000) / 60;
        int seconds = (int) (timeinLong / 1000) % 60;

        String timeFormatted = String.format(Locale.getDefault(), "%02d:%02d", minutes, seconds);

        player1.setText(timeFormatted);
        player1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startCountDown(player1);
                player2count.cancel();

            }
        });
        player2.setText(timeFormatted);
        player2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startCountDown2(player2);
                player1count.cancel();
            }
        });

    }

    private void startCountDown(final Button button) {
        player1count = new CountDownTimer(timeinLong, 1000) {
            @Override
            public void onTick(long millisUntilFinished) {
                timeinLong = millisUntilFinished;
                updateCountDownText(button);
            }

            @Override
            public void onFinish() {
                timeinLong = 0;
                updateCountDownText(button);
            }
        }.start();
    }

    private void startCountDown2(final Button button) {
        player2count = new CountDownTimer(timeinLong, 1000) {
            @Override
            public void onTick(long millisUntilFinished) {
                timeinLong = millisUntilFinished;
                updateCountDownText(button);
            }

            @Override
            public void onFinish() {
                timeinLong = 0;
                updateCountDownText(button);
            }
        }.start();
    }

    private void updateCountDownText(Button button) {
        int minutes = (int) (timeinLong / 1000) / 60;
        int seconds = (int) (timeinLong / 1000) % 60;

        String timeFormatted = String.format(Locale.getDefault(), "%02d:%02d", minutes, seconds);

        button.setText(timeFormatted);

        if (timeinLong < 30000) {
            button.setTextColor(Color.RED);
        } else {
            button.setTextColor(Color.BLACK);
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (player1count != null) {
            player1count.cancel();
        }
    }
} 

Ответы [ 3 ]

0 голосов
/ 20 июня 2020

player2count инициализируется только внутри startCountDown2, который вызывается только внутри player2.setOnClickListener. Следовательно, если вы нажмете кнопку player1 до того, как нажмете кнопку player2, вы получите NullPointerException, поскольку вызов player2count.cancel() на еще не инициализированном player2count не разрешен. Чтобы этого не произошло, в этом случае уместно просто проверить значение null:

if (player2count != null) {
  player2count.cancel();
}
0 голосов
/ 20 июня 2020

Просто не отменяйте таймеры, если они не инициализированы, это принесет NPE, поэтому проверьте, не равны ли они нулю в обоих проигрывателях, как показано ниже

    player1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startCountDown(player1);
            if (player2count != null)
                player2count.cancel();

        }
    });
    player2.setText(timeFormatted);
    player2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startCountDown2(player2);
            if (player1count != null)
                player1count.cancel();
        }
    });
0 голосов
/ 20 июня 2020

вы не инициализируете это при вызове прослушивателя кликов Я исправил это для себя, добавив try catch на строках .cancel или установите

if (player1count != null)
...
...