Android中的短、可变间隔计时器

Android中的短、可变间隔计时器,android,timer,Android,Timer,我正在尝试为Android创建一种节拍器。它应以一定的间隔播放一些可听见的哔哔声,给人一种节奏感。因此,时机非常关键。基本上,它应做到以下几点 (开始) 播放蜂鸣音类型1(约0.1s长) 等待x毫秒(介于500和1000之间) 播放蜂鸣音类型2(约0.1秒长) 等待y毫秒(介于500和1000之间) 播放蜂鸣音类型3(约0.1s长) 等待y毫秒(介于500和1000之间) 回到起点 UI活动将有一些按钮来调整等待间隔 通过阅读各种博客、教程和讨论,我似乎应该使用postdelayed()Runn

我正在尝试为Android创建一种节拍器。它应以一定的间隔播放一些可听见的哔哔声,给人一种节奏感。因此,时机非常关键。基本上,它应做到以下几点

(开始) 播放蜂鸣音类型1(约0.1s长)

等待x毫秒(介于500和1000之间)

播放蜂鸣音类型2(约0.1秒长)

等待y毫秒(介于500和1000之间)

播放蜂鸣音类型3(约0.1s长)

等待y毫秒(介于500和1000之间)

回到起点

UI活动将有一些按钮来调整等待间隔

通过阅读各种博客、教程和讨论,我似乎应该使用postdelayed()Runnable并将延迟设置为所需的等待时间x或y。之后,我应该开始播放声音。这应该允许我不考虑wav声音文件的长度

我大致上走对了吗?我意识到时间安排并不完美,因为还有其他服务正在运行,可能会延迟计时器的执行。为了提高这一点,我很乐意在飞行模式下使用手机,或者使用其他服务,因为在使用此应用程序时,我不需要其他任何东西

有这样的代码的完整示例吗?说到Android,我是个初学者。我的经验更多的是使用纯C嵌入式系统。把所有的类和它们的函数放在一起是相当令人畏惧的

感谢您的帮助,
Michael

我刚刚想到的一个关于在哔哔声之间等待的想法是启动一个单独的Java线程,在其中输入无限循环并调用
thread.sleep(interval)
类似

public MyLooper extends Runnable{
   private boolean shouldRun = true;
   private int interval = 1; //ms

   @Override
   public void run(){
      while(shouldRun){
         //play the beep

         Thread.sleep(interval);
      }

   }


   public void stop(){
      this.shouldRun = false;
   }

   public void setInterval(int interval){
      this.interval = interval;
   }
}
通常在
onResume
事件中启动活动(取决于您的需要)时,您需要创建Java线程。在单击按钮的内部,您可以通过调用
setInterval(…)
方法来调整间隔

可能是一个可能的解决方案…

这就是您需要的:

编辑:该教程专门针对一个UI更新场景,但它给出了您真正想要的东西的简单描述:TimerTask

class UpdateTimeTask extends TimerTask {
   public void run() {
       long millis = System.currentTimeMillis() - startTime;
       int seconds = (int) (millis / 1000);
       int minutes = seconds / 60;
       seconds     = seconds % 60;

       timeLabel.setText(String.format("%d:%02d", minutes, seconds));
   }
}


很抱歉,更清楚地说,您将希望在TimerTask中使用代码段。你对跑步者有着不可预知的时间感。关闭其他服务不应该是一个有效的选择,因为你可能想要“绝对的可预测性”,而不是“更容易预测”。TimerTasks引入了一个新的线程(这听起来可能很严厉),但如果你想让事情按时发生,这就是你要付出的代价。@TREVOR:谢谢。如果这能给我最好的计时准确性,我很乐意采用高压方法。这可能会奏效,但我没有尝试过:与其在计时器启动时播放短样本,不如生成长样本并循环播放。然后,只要您保持音频缓冲区已满,您就只需要依赖DAC时钟,Linux进程调度程序的变幻莫测不应该干扰。
if(startTime == 0L) {
   startTime = evt.getWhen();
   timer = new Timer();
   timer.schedule(new UpdateTimeTask(), 100, 200);
}