0

トグルボタンがチェックされているときに、間隔を置いて再生する音を出そうとしています。トグル ボタンをクリックすると、アプリがサウンドを再生せず、クラッシュします。なんで?

コード:

    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
4

2 に答える 2

0

あなたが抱えている根本的な問題は、UIスレッドで長い操作をしているということです。onCheckedChangedは、スレッドまたはAsyncクラスをスピンオフする必要があります。これにより、停止するまでカチカチという音が鳴ります。onCheckedChangedからオンとオフを切り替えるカチカチという音を出すためのスレッドがまだある方がよいでしょう。

おそらくこれを達成するための最良の方法は、@ Torben-Kohlmeierからのあなたの質問への回答にあります。これは、コードにどのように適合するかを明確にするために編集しました。

于 2013-03-14T22:26:15.257 に答える
0

ここではタイマーの使用をお勧めします。では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();
        }
    }
    
于 2013-03-15T08:22:14.877 に答える