2016-03-22 5 views
1

Я пытаюсь сделать метроном. Он имеет звук и вибро. Начальный метроном Service, и после запуска звука вибро синхронизировано, но когда я нажимаю home button, поворот метронома в фоновый режим, звук и вибро не работают в такт (вибрация приостанавливается некоторое время).Темы 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 и обнаружили, что проблема была не в теме. Проблема существует из-за «родных» вибраций, что у home button есть. Итак, насколько я понимаю, эти вибрации создают очередь, и поэтому мой метроном вибро теряет темп.

Что я могу сделать? Я сделал перезапуск метронома Service по методу onStart и onStop, но он неуклюжий и не решает проблему, когда я нажимаю menu-button.

ответ

0

Самый простой способ, с помощью которого я могу синхронизировать несколько потоков, - использовать CyclicBarrier. Идея состоит в том, что после выполнения своей части каждый поток вызывает await() и блокируется до тех пор, пока не появится последний, и в этот момент все они будут выпущены сразу.

+0

благодарит за ваш ответ. Это не помогло. Я изменил свой пост. –

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

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