使节拍器精确到android

时间:2012-10-12 15:14:12

标签: android timer

我正在为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

感谢

1 个答案:

答案 0 :(得分:1)

垃圾收集导致精度不足。尝试在每个刻度上摆脱新的对象创建。在您的代码中,每次MediaPlayer都会创建新的play_tick,它应该只进行一次defenitely初始化(并且您错过了MediaPlayer.release调用)。

另外,您可以使用Handler.postDelayed代替TimerTaskHandler.post

相关问题