2016-03-22 17 views
1

メトロノームを作ろうとしています。それは音と振動を持っています。 Serviceメトロノームを開始し、音を開始した後は振動が同期していますが、​​をクリックしてメトロノームをバックグラウンドモードにすると、サウンドとバイブロがビートに機能しません(振動がしばらく停止します)。バックグラウンドモードでAndroidスレッドが正しく動作しない

public int onStartCommand(final Intent intent, int flags, int startId) { 
    bpm = intent.getIntExtra(Constants.BPM, 60); 
    vibrator = (Vibrator) getApplicationContext().getSystemService(Context.VIBRATOR_SERVICE); 
    Thread sound = new Thread(new Runnable() { 
     @Override 
     public void run() { 
       metronome.setBeat(Constants.BEATS); 
       metronome.setNoteValue(Constants.NOTE_VALUE); 
       metronome.setBpm(bpm); 
       metronome.setBeatSound(Constants.BEAT_SOUND); 
       metronome.setSound(Constants.SOUND); 

       try { 
        metronome.play(); 
       } catch (IllegalStateException e) { 
        e.printStackTrace(); 
       } 
     } 
    }); 
    Thread vibro = new Thread(new Runnable() { 
     @Override 
     public void run() { 
       long pattern[] = new long[3]; 
       pattern[0] = 0; 
       pattern[1] = 50; 
       pattern[2] = 950; 
       vibrator.vibrate(pattern, 0); 
     } 
    }); 
    sound.start(); 
    vibro.start(); 

どのように同期させるのですか?

P.S.また、画面をロックすると振動が止まります(ただし音は継続しています)。


EDIT

私はその問題がスレッドではなかった、CyclicBarrierを使用しようとしました。問題は、 "ネイティブ"振動のために、その​​が存在します。だから私が理解しているように、これらの振動はキューを作るので、私のメトロノームの振動はテンポを失う。

どうすればよいですか?メトロノームServiceonStartonStopの方法で再起動しましたが、それは不器用で、menu-buttonをクリックしても問題は解決しません。

答えて

0

私が複数のスレッドを同期させる最も簡単な方法は、CyclicBarrierを使用することです。そのアイデアは、各スレッドがawait()を呼び出して最後のスレッドが到着するまでブロックされ、その時点でそれらはすべて一度に解放されるということです。

+0

ご返信ありがとうございます。それは助けになりませんでした。私は私のポストを変更しました。 –

関連する問題