2012-01-31 81 views
1

我试图实现一个简单的数字时钟与第二和两个冒号每秒更改。我曾考虑过使用DigitalClock,但我希望冒号和第二个闪烁,并且不想显示上午/下午。所以我读了“从计时器更新用户界面”,并建议我们使用Handler。所以我使用Handler,可以每秒更改第二个和冒号,但奇怪的是,有时会跳过第二个(1,2,4,5,6)。看来时钟有点滞后。有什么办法可以解决这个问题吗?谢谢!Android处理程序跳过/跳一秒

tick_handler = new Handler(); 
    Runnable updateSecond = new Runnable(){ 
     @Override 
     public void run() { 
      second.setText(DataModel.getSeconds()); 
      if(colon1.getVisibility()== View.VISIBLE){ 
       colon1.setVisibility(View.INVISIBLE); 
       colon2.setVisibility(View.INVISIBLE); 
      } else { 
       colon1.setVisibility(View.VISIBLE); 
       colon2.setVisibility(View.VISIBLE); 
      } 
      tick_handler.postDelayed(this, 1000); 
     } 
    }; 
tick_handler.postDelayed(updateSecond, 0); 

回答

0

我怀疑你在仿真器上看到它,因为它比实际手机慢得多。尝试将tick_handler.postDelayed(this, 1000);更改为小于1秒的值,例如500毫秒

tick_handler.postDelayed(this, 500); 

,并添加一个全局变量来跟踪线程运行的每个时间之间的型差分和如果所述差是1秒,更新视图。

+0

嗨,谢谢,我正在使用模拟器。刚刚改变1000到500,第二次停止跳跃,但有时,它变化非常快(34,35,迅速改变为36)。这可能是我在仿真器上运行它的问题,因为我使用了Thread.sleep(1000),并且发生了同样的情况。所以我想你是对的,我会试着让一台真机测试。谢谢! – Dongminator 2012-01-31 16:30:39

+0

看来你错过了我答案的第二部分。您需要创建一个全局变量,该变量在每次运行线程时开始对millis进行计数,并且仅在运行second.setText()方法时改变视图的可见性,当累计达到3600时 – 2012-01-31 19:54:47

+0

使用全局变量有效!谢谢!我检查SystemClock.elapsedRealtime() - global_variable> 1000,然后运行setText()代码。再次感谢!!! – Dongminator 2012-01-31 23:11:12