我正在尝试为Android创建一种节拍器。它会以一定的间隔发出一些可听见的哔哔声,给人一种节奏感。因此,时机非常关键。基本上它应该做以下
(开始) 播放蜂鸣声类型1(约0.1秒长)
等待x毫秒(介于500和1000之间)
播放蜂鸣声类型2(约0.1秒长)
等待y毫秒(介于500和1000之间)
播放哔声类型3(约0.1秒长)
等待y毫秒(介于500和1000之间)
回去开始
UI活动将有一些按钮来调整等待间隔。
通过阅读所有各种博客,教程和讨论,似乎我应该使用postdelayed()Runnable并将延迟设置为我所需的等待时间x或y。之后,我应该开始播放声音。这应该允许我不考虑wav声音文件的长度。
我是否大致走上正轨?我意识到时机不会很完美,因为有其他服务运行可能会延迟我的计时器的执行。为了改善这一点,我很乐意在飞行模式下使用手机或转向其他一些服务,因为在使用此应用程序时我不需要任何其他服务。
那里有这些代码的完整示例吗?对于Android,我是初学者。我对直接C嵌入式系统的经验更多。将所有类及其功能放在一起是非常艰巨的。
任何帮助表示赞赏, 迈克尔
答案 0 :(得分:1)
关于哔哔声之间的等待,我想到的一个想法就是启动一个单独的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(...)
方法来调整间隔。
可能是一个可能的解决方案......
答案 1 :(得分:1)
这就是你需要的: Updating the UI from a Timer
编辑:该教程专门针对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));
}
}
和
if(startTime == 0L) {
startTime = evt.getWhen();
timer = new Timer();
timer.schedule(new UpdateTimeTask(), 100, 200);
}