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 
+1

你能后的logcat的? – romo 2013-03-14 21:52:56

+0

我是否在'CheckChangeListener'事件中有'while(true)'发生了? – Grambot 2013-03-14 21:54:38

+0

我应该从CheckChangeListener事件中移动吗? – 2013-03-14 21:55:55

你有根本的问题是,你是在UI线程执行长时间操作。 onCheckedChanged应该旋转一个线程或Async类,它将使滴答声直到停止。更好的是,还有一个线程可以使你从onCheckedChanged打开和关闭的滴答声。

可能实现这一目标的最佳方式已在答案被给予从@托本 - Kohlmeier你的问题,我已经编辑弄清楚它是如何与您的代码相符。

+0

可否请向我解释如何制作另一个打开的线程,以及来自onCheckedChange播放滴答声音的线程? – 2013-03-14 22:38:30

+0

@托本 - kohlmeier提供基于同样的想法,已编辑成适合你的问题更清楚一个更好的答案。 – 2013-03-15 11:56:06

我建议使用Timer这里的。使用Timer.scheduleAtFixedRate(TimerTask task, long delay, long period),您可以计划任务以间隔(周期)运行。 此外,你需要一个TimerTask。只需创建一个扩展TimerTask并实现run()方法来播放节拍器声音的类。

给你一些示例代码:

  1. 在你的活动创建的定时器:

    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. 
    
  2. 实现MetronomeTimerTask为您的活动类的子类:

    class MetronomeTimerTask extends TimerTask { 
        @Override 
        public void run() { 
         // play the metronome sound, from your code. 
        } 
    } 
    
  3. 启动或停止计时器 里面哟乌尔的代码有问题,更换onCheckedChanged:

    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
        if (metronomepp.isChecked()) { 
         timer.scheduleAtFixedRate(new MetronomeTimerTask(), 0, timerTickGapMilliSeconds); 
        } 
        else { 
         timer.cancel(); 
        } 
    }