Android Toggle Button崩溃了

时间:2013-03-14 21:51:26

标签: android audio crash playback togglebutton

我正在尝试在选中切换按钮时间隔播放声音。点击切换按钮后,我的应用程序不播放任何声音和崩溃。为什么呢?

代码:

    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

2 个答案:

答案 0 :(得分:0)

您遇到的根本问题是您在UI线程中进行了长时间的操作。 onCheckedChanged应该分离一个线程或Async类,它会发出滴答声,直到它停止。最好还是有一个线程可以打开和关闭onCheckedChanged的滴答声。

@ Torben-Kohlmeier在你的问题中给出了解决问题的最佳方法,我已经编辑了这个问题,以明确它是如何与你的代码相符的。

答案 1 :(得分:0)

我建议在这里使用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实现为Activity Class的子类:

    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();
        }
    }