我创建了一个类似节拍器的Android应用程序。
实际上我想每n毫秒发出一声嘟嘟声。
我使用MediaPlayer
和计时器。
我的代码是这样的:
Soloution 1:
start_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Timer timer = new Timer("MetronomeTimer", true);
TimerTask tone = new TimerTask() {
@Override
public void run() {
//Log
DateFormat df = new SimpleDateFormat("dd/MM/yy HH:mm:ss:SS");
Date date = new Date();
j++;
Log.i("Beep", df.format(date) + "_____" + j);
//Play sound
music = MediaPlayer.create(MainActivity.this, R.raw.beep);
music.start();
}
};
timer.scheduleAtFixedRate(tone, 500, 500); // every 500 ms
}
});
当我运行此代码时,一切正常。但经过15次循环后,Log系列工作正常,但声音静音。偶尔每15或20个日志声音会播放并停止播放。
解决方案2:
我移动这一行:
music = MediaPlayer.create(MainActivity.this, R.raw.beep);
TimerTask
(像这样):
start_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
music = MediaPlayer.create(MainActivity.this, R.raw.beep);
Timer timer = new Timer("MetronomeTimer", true);
TimerTask tone = new TimerTask() {
@Override
public void run() {
//Log
DateFormat df = new SimpleDateFormat("dd/MM/yy HH:mm:ss:SS");
Date date = new Date();
j++;
Log.i("Beep", df.format(date) + "_____" + j);
//Play sound
music.start();
}
};
timer.scheduleAtFixedRate(tone, 500, 500); // every 500 ms
}
});
此代码也可以,直到重复500毫秒。当周期时间减少到400或300 ms时,每2 Log,一声响起。
如何修复此代码可以正常工作。
答案 0 :(得分:1)
SoundPool更适合播放从内存加载的短音。我在实施MediaPlayer
方面遇到了问题,SoundPool
只是一种更容易,更低延迟的体验。
如果您将.setMaxStreams()
设置为高于1的数字,则不应发出任何静音。尝试并试验。