Android同一按钮实现多点击事件:计时器启停及变量作用域修复
解决Android计时器按钮启停的变量作用域问题
嗨,你遇到的这个错误是典型的变量作用域问题——你把startTime定义在if代码块内部,它的作用域只限于这个if块,当进入else块时,这个变量就已经“消失”了,所以编译器找不到它。咱们只需要调整一下变量的定义位置就能解决这个问题啦!
修改后的完整代码
public class DepthActivity extends AppCompatActivity implements View.OnClickListener { // 把状态标记和计时起始变量都定义为类的成员变量 boolean showingFirst = true; long startTime; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_depth); findViewById(R.id.btn).setOnClickListener(this); } public void generate(View view){ if(showingFirst){ // 第一次点击时,记录当前时间到成员变量startTime startTime = System.currentTimeMillis(); showingFirst = false; }else{ // 第二次点击时,计算时间差 long difference = System.currentTimeMillis() - startTime; showingFirst = true; // 更新TextView显示结果 TextView myText = (TextView)findViewById(R.id.tv); myText.setText(String.valueOf(difference)); } } }
关键修改说明
- 将
startTime从if块内部移到类的成员变量位置,这样整个类的generate方法都能访问到这个变量; - 第一次点击按钮时,给
startTime赋值当前时间戳; - 第二次点击时,直接用当前时间减去
startTime得到时间差,再更新TextView显示。
额外小建议
如果是测量短时间间隔,推荐使用System.nanoTime()代替System.currentTimeMillis(),因为nanoTime不受系统时间调整(比如手动改时间、NTP同步)的影响,计时会更准确。替换的话只需要把两处System.currentTimeMillis()改成System.nanoTime(),最后显示的时候可以转换成毫秒(除以1000000)让结果更易读。
内容的提问来源于stack exchange,提问作者user8863067
相关产品推荐
相关产品推荐

