我正在尝试在选中切换按钮时间隔播放声音。点击切换按钮后,我的应用程序不播放任何声音和崩溃。为什么呢?
代码:
int bpm;
double timetw;
final Button plus = (Button) findViewById(R.id.tempop);
final Button minus = (Button) findViewById(R.id.tempom);
final TextView curbpm = (TextView) findViewById(R.id.curbpm);
final ToggleButton metronomepp = (ToggleButton) findViewById (R.id.metronomepp);
final MediaPlayer metronome = MediaPlayer.create(this, R.raw.beep);
bpm=60;
timetw=((60/bpm)-0.19)*10000;
curbpm.setText("" + bpm);
Log.i("Metronome1", ""+metronomepp.isChecked());
metronomepp.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
while (metronomepp.isChecked()) {
metronomepp.postDelayed(new Runnable() {
@Override
public void run() {
Log.i("Metronome", "InWhile");
if (metronome.isPlaying()) {metronome.pause();}
metronome.seekTo(0);
metronome.setOnSeekCompleteListener(null);
metronome.start();
metronome.setOnCompletionListener(null)
}
}, (long) (timetw));
}
}
});
按下切换按钮后LogCat:
03-14 22:54:17.094: D/dalvikvm(25418): GC_CONCURRENT freed 101K, 3% free 9518K/9735K, paused 3ms+3ms
03-14 22:54:18.019: D/dalvikvm(25418): GC_CONCURRENT freed 5K, 2% free 9923K/10055K, paused 2ms+2ms
03-14 22:54:19.744: D/dalvikvm(25418): GC_CONCURRENT freed 0K, 2% free 10312K/10439K, paused 1ms+1ms
03-14 22:54:23.039: D/dalvikvm(25418): GC_CONCURRENT freed 0K, 2% free 10759K/10887K, paused 1ms+1ms
答案 0 :(得分:0)
您遇到的根本问题是您在UI线程中进行了长时间的操作。 onCheckedChanged应该分离一个线程或Async类,它会发出滴答声,直到它停止。最好还是有一个线程可以打开和关闭onCheckedChanged的滴答声。
@ Torben-Kohlmeier在你的问题中给出了解决问题的最佳方法,我已经编辑了这个问题,以明确它是如何与你的代码相符的。
答案 1 :(得分:0)
我建议在这里使用Timer。使用Timer.scheduleAtFixedRate(TimerTask task, long delay, long period)
,您可以安排任务以间隔(句点)运行。
此外,您需要一个TimerTask。只需创建一个扩展TimerTask的类并实现run()方法来播放节拍器声音。
为您提供一些代码示例:
在您的活动中创建计时器:
class MyActivity extends Activity {
// In the variables declared for the class:
private Timer timer = new Timer();
private long timerTickGapMilliseconds = 1000L; // Change this to change how often the sound is played.
将MetronomeTimerTask实现为Activity Class的子类:
class MetronomeTimerTask extends TimerTask {
@Override
public void run() {
// play the metronome sound, from your code.
}
}
启动或停止计时器 在问题代码中,替换onCheckedChanged:
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (metronomepp.isChecked()) {
timer.scheduleAtFixedRate(new MetronomeTimerTask(), 0, timerTickGapMilliSeconds);
}
else {
timer.cancel();
}
}