Android 播放音乐一次倒计时

Android 播放音乐一次倒计时,android,countdowntimer,Android,Countdowntimer,我只想在几秒钟内播放一次声音文件,但如果我将倒计时间隔设置为100到700,则会执行两到三次操作(由于四舍五入)。如果我将倒计时间隔设置为700到1000,我将得到10到2范围内的一个操作,但是如果我将播放声音文件设置为1秒,我将得到两个播放,因为单击将轮数设置为1。 是的,我知道。 谢谢你的帮助 public void startTimer() { tCountDownTimer = new CountDownTimer(tTime * 1000, 1000) {

我只想在几秒钟内播放一次声音文件,但如果我将倒计时间隔设置为100到700,则会执行两到三次操作(由于四舍五入)。如果我将倒计时间隔设置为700到1000,我将得到10到2范围内的一个操作,但是如果我将播放声音文件设置为1秒,我将得到两个播放,因为单击将轮数设置为1。 是的,我知道。 谢谢你的帮助

  public void startTimer() {
          tCountDownTimer = new CountDownTimer(tTime * 1000, 1000) {    
      @Override
      public void onTick(long millisUntilFinished) {
          int seconds = (int) (millisUntilFinished / 1000);       
          int minutes = seconds / 60;
          int hours = minutes / 60;
          minutes = minutes % 60;
          seconds = seconds % 60;
          String curTime = hours + ":" + minutes + "::" + seconds;
          Log.v("log_tag", "Log is here Time is now" + curTime);
          tTimeLabel.setText(String.format("%02d:%02d:%02d", hours, minutes, seconds));
          runSec (seconds); 
          runMin (minutes);
          runHou (hours);
          if (seconds == 3) {
              playAlertSound(R.raw.beep1);
              }
          else if(seconds == 2){
              playAlertSound(R.raw.beep1);
              }
          else if(seconds == 1){
              playAlertSound(R.raw.beep1);
              }
          else if(seconds == 0){
              playAlertSound(R.raw.beep2);
              }
如果我使用
int seconds=Math.round(毫秒直到完成/1000)

如果我使用
int seconds=Math.round(毫秒直到完成/1000f)

这是用户在驯服器上设置的时间:

protected int tTime = 0;

public void onClick(View v) {
    if(v == upTimesl && tTime <= (11*60*60+1*59*60+55))
      settTime(tTime + 5);
    else if(v == downTimesl && tTime > 5)
      settTime(tTime - 5);
    else if(v == downTimesl && tTime <= 5)
          settTime(tTime=0);
...
protectedintttime=0;
公共void onClick(视图v){
如果(v==正常运行时间和时间5)
设置时间(tTime-5);

否则,如果(v==downTimesl&&tTime从数学上讲,您没有取整,则您正在进行地板操作。如果
millisuntilfeigned/1000
实际上是0.9999,则您保证得到0。您应该使用
Math.round()

(请注意,我正在除以
1000f
,将long除以整数仍然是一个floor操作。)

您当前的间隔是100毫秒,这没有意义,因为您所有的计算都是以秒为基础的。您应该使用:

tCountDownTimer = new CountDownTimer(tTime * 1000, 1000) { 


此外,倒计时还有一些怪癖:它会在每个间隔上增加几毫秒,并且在调用
onFinish()
之前通常会跳过最后一个间隔。我在返回时对这个类做了一些更改,以消除中的这些错误。

我同意您关于舍入和延迟的看法(测试不同的方法)但是如果我使用'int seconds=Math.round(millisuntiltfinished/1000f);'计时器会停止两秒钟。下面是日志文件:'12-06 18:58:10.191:V/log_标记(649):log在这里时间现在是0:0::5 12-06 18:58:11.239:V/log_标记(649):log在这里时间现在是0:0::4 12-06 18:58:12.278:V/log_标记(649):Log is here Time is now 0:0::3 12-06 18:58:13.318:V/Log_tag(649):Log is here Time is now 0:0::2'将您的LogCat添加到您的问题中(单击左下角的“编辑”),以便我可以看到更多的LogCat。好的,
tTime
设置为什么?我看到倒计时显示“5,4,3,2”并跳过“1”.这是我修正的错误之一。
1000f
的时间是正确的,因为您从5开始倒数。
protected int tTime = 0;

public void onClick(View v) {
    if(v == upTimesl && tTime <= (11*60*60+1*59*60+55))
      settTime(tTime + 5);
    else if(v == downTimesl && tTime > 5)
      settTime(tTime - 5);
    else if(v == downTimesl && tTime <= 5)
          settTime(tTime=0);
...
int seconds = Math.round(millisUntilFinished / 1000f);       
tCountDownTimer = new CountDownTimer(tTime * 1000, 1000) {