Android多CountDownTimer对象创建异常问题求助
问题根源与修复方案
嘿,我一眼就看出问题出在哪了——你所有的CountDownTimer实例都在操作同一个全局的countdown TextView,而且你还同时启动了两个计时器,它们互相抢着修改同一个UI控件的文本,结果自然就是数字乱跳了。
为啥会这样?
- 共用UI控件:你在
onTick里更新的countdown是个全局变量,不管创建多少个计时器,它们都会往同一个TextView里写数字。两个计时器同时跑的时候,你写一个我写一个,显示的内容当然混乱。 - 同时启动计时器:你连续调用
timer1.start()和timer2.start(),两个计时器会立刻同时开始倒计时,而不是你期望的“先跑完第一个再跑第二个”。
怎么修复?
方案1:给每个计时器分配独立的TextView
修改你的setUpCountdown方法,把TextView作为参数传进去,让每个计时器只操作自己的专属UI:
private CountDownTimer setUpCountdown(int duration, int tick, TextView countdownView) { // 处理默认tick值 tick = (tick == 0 ? 1 : tick); return new CountDownTimer(duration*1000, tick*1000) { @Override public void onTick(long millisUntilFinished) { if (countdownView != null) { int timeRemaining = (int) (millisUntilFinished / 1000); countdownView.setText(String.valueOf(timeRemaining)); } } @Override public void onFinish() { if (countdownView != null) { countdownView.setVisibility(View.INVISIBLE); baseLayout.removeView(countdownView); } baseLayout.setBackgroundColor(Color.BLACK); } }; }
然后创建独立的TextView分别绑定计时器:
// 第一个计时器的UI TextView countdown1 = new TextView(this); countdown1.setTextColor(Color.WHITE); baseLayout.addView(countdown1); CountDownTimer timer1 = setUpCountdown(8, 1, countdown1); // 第二个计时器的UI TextView countdown2 = new TextView(this); countdown2.setTextColor(Color.WHITE); baseLayout.addView(countdown2); CountDownTimer timer2 = setUpCountdown(5, 1, countdown2);
方案2:让计时器依次启动(先跑完第一个再跑第二个)
如果你的需求是先完成第一个倒计时,再启动第二个,那可以在第一个计时器的onFinish里触发第二个的启动(同样要注意UI的切换):
// 先创建一个共用的TextView(如果不需要同时显示两个的话) TextView countdown = new TextView(this); countdown.setTextColor(Color.WHITE); baseLayout.addView(countdown); // 创建两个计时器 CountDownTimer timer1 = new CountDownTimer(8*1000, 1000) { @Override public void onTick(long millisUntilFinished) { int timeRemaining = (int) (millisUntilFinished / 1000); countdown.setText(String.valueOf(timeRemaining)); } @Override public void onFinish() { // 第一个结束后,重置UI并启动第二个 baseLayout.setBackgroundColor(Color.BLACK); // 启动第二个计时器 CountDownTimer timer2 = new CountDownTimer(5*1000, 1000) { @Override public void onTick(long millisUntilFinished) { int timeRemaining = (int) (millisUntilFinished / 1000); countdown.setText(String.valueOf(timeRemaining)); } @Override public void onFinish() { countdown.setVisibility(View.INVISIBLE); baseLayout.removeView(countdown); baseLayout.setBackgroundColor(Color.BLACK); } }; timer2.start(); } }; timer1.start();
小提醒
记得在页面销毁(比如onDestroy)的时候调用所有计时器的cancel()方法,不然会有内存泄漏的风险哦。
内容的提问来源于stack exchange,提问作者chh
相关产品推荐
相关产品推荐

