Android的切换按钮崩溃
我想发出声音,当切换按钮被选中的间隔发挥。当我点击切换按钮后,我的应用程序不会播放任何声音和崩溃。为什么?Android的切换按钮崩溃
代码:
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
你有根本的问题是,你是在UI线程执行长时间操作。 onCheckedChanged应该旋转一个线程或Async类,它将使滴答声直到停止。更好的是,还有一个线程可以使你从onCheckedChanged打开和关闭的滴答声。
可能实现这一目标的最佳方式已在答案被给予从@托本 - Kohlmeier你的问题,我已经编辑弄清楚它是如何与您的代码相符。
可否请向我解释如何制作另一个打开的线程,以及来自onCheckedChange播放滴答声音的线程? – 2013-03-14 22:38:30
@托本 - kohlmeier提供基于同样的想法,已编辑成适合你的问题更清楚一个更好的答案。 – 2013-03-15 11:56:06
我建议使用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为您的活动类的子类:
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(); } }
你能后的logcat的? – romo 2013-03-14 21:52:56
我是否在'CheckChangeListener'事件中有'while(true)'发生了? – Grambot 2013-03-14 21:54:38
我应该从CheckChangeListener事件中移动吗? – 2013-03-14 21:55:55