我正在为安卓制作节拍器。当它只是捕捉时间时,我能够以 1-5 毫秒的精度运行 play_tick() 函数,但是一旦我想另外播放声音,系统就会变得不准确(最差的十倍)。您对我如何改善这一点有任何线索吗?有时,系统也会完全随机跳过播放刻度。有什么办法可以提高任务的优先级,或者调度程序会优先考虑后台运行的android任务吗?我已经搜索了一段时间,但找不到任何线索。
所有帮助将不胜感激!
我已经稍微更新了代码:
public void soundMetronome(){
MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.click);
metronome = new TimerTask() {
public void run() {
handler.post(new Runnable() {
public void run() {
if(counter<SAMPLE_LENGTH){
store_time[counter] = System.currentTimeMillis();
mp.start();
counter++;
Log.d("TIMER", "Timer set off");
}
else{
stopScan();
}
}
});
}};
t.scheduleAtFixedRate(metronome, 0, SAMPLE_INTERVAL_MS);
}
但是,对于 500 毫秒左右的间隔,它仍然非常不准确。对于大约 1000 毫秒的间隔,它非常稳定。问题不在于计时器任务本身,而是在我读取 currentTimeMillis() 和来自 MediaPlayer 的 PLAYBACK_COMPLETE 消息的时间之间,一些原生 android 进程似乎中断了。
有没有办法可以在 mp.start() 之后调用 mp.prepare() 以便媒体播放器准备好在调用计时器函数时立即运行?
我正在使用 Galaxy S3 和 Android 4.1
谢谢