2013-03-14 1 views
0

Я пытаюсь сделать звук, чтобы играть в промежутках, когда проверяется кнопка переключения. После того, как я нажимаю кнопку переключения, мое приложение не воспроизводит звук и не сработает. Зачем?Android Toggle Button crashes

Код:

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

+0

Я читаю это прямо там, где у вас есть 'while (true)', происходящий на событии 'CheckChangeListener'? – Grambot

+0

Должен ли я перемещаться из события CheckChangeListener? –

ответ

0

Основная проблема у вас есть то, что вы делаете длинную операцию в потоке пользовательского интерфейса. OnCheckedChanged должен открутить поток или класс Async, который сделает тикающий звук до тех пор, пока он не будет остановлен. Лучше еще есть поток, чтобы сделать тикающий звук, который вы включаете и выключаете из onCheckedChanged.

Возможно, лучший способ достичь этого был дан в ответе от @ Torben-Kohlmeier на ваш вопрос, который я редактировал, чтобы уточнить, как он соответствует вашему коду.

+0

Не могли бы вы объяснить мне, как включить другой поток, который включен, и из onCheckedChange для воспроизведения тикающего звука? –

+0

@ torben-kohlmeier предоставил еще лучший ответ, основанный на тех же идеях, который был отредактирован, чтобы вписаться в ваш вопрос более четко. –

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 как подкласс вашего класса активность:

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

 Смежные вопросы

  • Нет связанных вопросов^_^