我正在为Android制作节拍器。我只能在捕获时间时以1-5ms的精度运行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);
}
然而,对于大约500ms的间隔,它仍然非常不准确。对于大约1000ms的间隔,它是非常稳定的。问题不在于计时器任务本身,但是在我从MediaPlayer读取currentTimeMillis()和PLAYBACK_COMPLETE消息之间,一些本机android进程似乎会中断。
有没有办法可以在mp.start()之后调用mp.prepare(),这样媒体播放器就会准备好在调用定时器函数时立即运行?
我正在使用Galaxy S3和Android 4.1
感谢
答案 0 :(得分:1)
垃圾收集导致精度不足。尝试在每个刻度上摆脱新的对象创建。在您的代码中,每次MediaPlayer
都会创建新的play_tick
,它应该只进行一次defenitely初始化(并且您错过了MediaPlayer.release
调用)。
另外,您可以使用Handler.postDelayed代替TimerTask
和Handler.post
。