单击按钮时,倒数计时器取消会使应用程序崩溃
Countdowntimer cancel crashes the app when click on button
我正在尝试创建一个 countDownTimer 但是,每当我单击该按钮时,应用程序就会崩溃。
我希望如果我点击 player1 按钮 player2 倒计时 应该暂停,反之亦然 player2.
我得到的错误:
Attempt to invoke virtual method 'void
android.os.CountDownTimer.cancel()' on a null object reference
这是代码
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();
}
}
}
点击侦听器调用时您没有初始化它
我通过在 .cancel 行
上添加 try catch 自己修复了它
或设置
if (player1count != null)
...
player2count
仅在 startCountDown2
内部初始化,仅在 player2.setOnClickListener
内部调用。因此,如果您在单击 player2
按钮之前单击 player1
按钮,您将得到一个 NullPointerException
,因为在尚未初始化的 player2count
是不允许的。为了防止这种情况发生,在这种情况下只检查 null 是合适的:
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();
}
});
我正在尝试创建一个 countDownTimer 但是,每当我单击该按钮时,应用程序就会崩溃。 我希望如果我点击 player1 按钮 player2 倒计时 应该暂停,反之亦然 player2.
我得到的错误:
Attempt to invoke virtual method 'void android.os.CountDownTimer.cancel()' on a null object reference
这是代码
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();
}
}
}
点击侦听器调用时您没有初始化它
我通过在 .cancel 行
上添加 try catch 自己修复了它
或设置
if (player1count != null)
...
player2count
仅在 startCountDown2
内部初始化,仅在 player2.setOnClickListener
内部调用。因此,如果您在单击 player2
按钮之前单击 player1
按钮,您将得到一个 NullPointerException
,因为在尚未初始化的 player2count
是不允许的。为了防止这种情况发生,在这种情况下只检查 null 是合适的:
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();
}
});