2015-04-23 51 views
3

我不知道为什么这个倒数计数器在最后显示一个随机数?
我的意思是,它有时会显示60:15,有时60:07,等等这样为什么使用线程倒数计数器显示错误的值?

min=sec=0; 
new Thread(new Runnable() { 
    @Override 
    public void run() { 
     while (min < 60 && flagTime) { 
      try { 
       Thread.sleep(1); 
       G.HANDLER.post(new Runnable() { 
        @Override 
        public void run() { 
         String preSec=""; 
         String preMin=""; 
         if (sec < 59) { 
          sec += 1; 
         } 
         if (sec < 10) { 
          preSec = "0"; 
         } 
         if (min < 10) { 
          preMin = "0"; 
         } 
         score =preMin + min + ":" 
           + preSec + sec; 
         txt[elementNumber + 1].setText(score); 
        } 
       }); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
}).start(); 

请有人告诉我,为什么这么奇怪?

+0

,因为它也需要时间来处理你的书面代码 – Salmaan

+0

和你试着通过写这段代码来达到什么目的? – Salmaan

+0

'run()'里面的逻辑是什么? – Kushal

回答

1

所有操作系统中的时间安排都不准确,除非您使用已经为此任务设计的框架或工具。但是,您可以使用Thread.Sleep并具有合理的不确定性。但是对于“合理”和“精确”的时机,这取决于你正在试图解决的问题。

在线程中,睡眠(1000)并不意味着线程会精确睡眠1秒,以便线程每次运行应用程序时睡眠的次数会减少或减少。这就是为什么你会得到随机结果。

这有许多其他事情要考虑像线程的优先级。 所以更好的方法来计算下来是使用搭载Android提供的其他方式:

CountDownTimer

Timer

您可以检查在谷歌,你会发现关于如何使用它们的例子很多。

那些更可靠和更多精确

希望这有助于。

+1

事实上,Thread.sleep接收的时间以毫秒为单位,所以...也许如果他使用1000而不是1,那么错误可能不那么明显。 但无论如何,最好是使用你的建议类。 – shalafi

+0

@shalafi谢谢我更新了我的答案 – MBH

0

在TextView中出现怪异结果的可能原因是,您是从非主UI线程的线程更新它。

但是,你正在使这比它需要更难。一种更简单的方法是使用一个简单的CountDownTimer对象是这样的:

final long SECS_IN_1_MIN = 60; 
final long MILLIS_IN_1_SEC = 1000; 
final long MILLIS_IN_60_MINS = 3600000; 

final TextView timer = (TextView) findViewById(R.id.timer); 
new CountDownTimer(MILLIS_IN_60_MINS, MILLIS_IN_1_SEC) { 
    public void onTick(long millisUntilFinished) { 
     if (flagTime) { 
      long secs = (MILLIS_IN_60_MINS - millisUntilFinished)/MILLIS_IN_1_SEC; 
      timer.setText(String.format("%02d:%02d", secs/SECS_IN_1_MIN, secs % SECS_IN_1_MIN)); 

     } else { 
      timer.setText("cancelled"); 
      cancel(); 
     } 
    } 

    public void onFinish() { 
     timer.setText("time expired"); 
    } 
}.start(); 

编辑:它采用了CountDownTimer处理时间,同时利用其millisUntilFinished值来计算和显示这似乎是越来越秒计数。我投入了一些符号名称以使代码更清晰,并使用String.format以更优雅的方式处理单个数字值。请享用!