Android中的短、可变间隔计时器
我正在尝试为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嵌入式系统。把所有的类和它们的函数放在一起是相当令人畏惧的 感谢您的帮助,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
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);
}