java - 为什么onFinish在android studio中运行多次?
问题描述
我创建了一个计算点击次数的按钮并创建了一个 5 秒的计时器。5秒后,我想通过将计数器除以5来找到每秒点击次数(cps)。但是,问题是在我将计数器重置为0后,查找cps的代码仍然在onFinish方法中运行,并且使 cps 也为 0。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mtextViewCountDown = (TextView) findViewById(R.id.text_view_countdown);
btnClick = (Button) findViewById(R.id.button2);
displayCPS = (TextView) findViewById(R.id.cps);
btnClick.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startTimer();
counter++;
btnClick.setText(Integer.toString(counter));
}
});
}
public void startTimer(){
countDownTimer = new CountDownTimer(timeLeft,1000){
public void onTick(long l){
timeLeft = l;
updateTimer();
}
public void onFinish() {
cps = counter / 5;
System.out.println(cps);
displayCPS.setText("CPS: " + Double.toString(cps));
}
}.start();
}
public void updateTimer(){
int minutes = 0;
int seconds = (int) timeLeft / 1000;
String timeLeftFormatted = String.format(Locale.getDefault(),"%02d:%02d", minutes, seconds);
mtextViewCountDown.setText(timeLeftFormatted);
}
public void resetTimer(){
counter = 0;
btnClick.setText(Integer.toString(0));
timeLeft = 5000;
}
我尝试调试它并在控制台中打印出 cps。
I/System.out: 5.0
I/System.out: 0.0
I/chatty: uid=10088(com.example.cpspractice) identical 14 lines
I/System.out: 0.0
I/System.out: 0.0
I/chatty: uid=10088(com.example.cpspractice) identical 10 lines
I/System.out: 0.0
似乎 onFinish 运行了多次。你们知道如何让它只运行一次吗?
解决方案
onFinish()
运行一次 - 但您启动的每个计时器都会运行一次。
似乎每次单击按钮时都会启动一个计时器,因此如果您点击该按钮 20 次,您将启动 20 个计时器,并且每个计时器都会onFinish()
调用一次它的方法。
要修复仅启动一个计时器的问题,例如在第一次单击时:
btnClick.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
counter++;
if (counter == 1) {
startTimer();
}
btnClick.setText(Integer.toString(counter));
}
});
推荐阅读
- google-apps-script - 称为值的边框和排序公式
- java - 记录器的 Junit 测试用例
- cmake - Cmake - 导出和导入库
- php - stdClass 属性的类型提示?
- php - 在 PHP 中生成唯一字母时的问题
- matlab - MATLAB plot:自动使用列变量(名称)作为图例中的显示名称
- html - 用于选择不包含 table 元素的 div 元素的 css 查询
- ruby-on-rails - 使用 Rails 3.2.13,我尝试在每次用户注销时访问 Warden Manager before_logout 回调
- node.js - NodeJS HTTP - 侦听 80 以外的其他端口
- php - PHP - 从文件路径中提取当前目录和文件名