提问者:小点点

点击按钮时Countdowntimer cancel会使应用程序崩溃


我正在尝试创建一个倒计时器,但每当我点击按钮,应用程序就会崩溃。 我想,如果我点击播放器1按钮,播放器2倒计时应该暂停,反之亦然,播放器2。

我得到的错误是:

尝试对空对象引用调用虚拟方法“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个答案

匿名用户

Player2Count仅在StartCountDown2内部初始化,而StartCountDown2仅在Player2.SetOnClickListener内部调用。 因此,如果您在单击Player2按钮之前单击Player1按钮,您将获得一个NullPointerException,因为不允许对尚未初始化的Player2Count调用Player2Count.cancel()。 为了防止这种情况发生,在这种情况下只检查空值是合适的:

if (player2count != null) {
  player2count.cancel();
}

匿名用户

只是不要取消计时器,除非它们被初始化,这将带来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();
        }
    });

匿名用户

当单击“侦听器调用”时,您不初始化该命令。
我通过“添加”,“尝试”,“捕获”为自己修复了该命令。请取消行
或设置

if (player1count != null)
...