2016-03-22 9 views
1

Ich versuche, ein Metronom zu machen. Es hat Sound und Vibro. Die Service starten Metronom, und nach dem Starten des Sounds sind die Vibro synchron, aber wenn ich auf home button klicke, drehen Metronom in den Hintergrundmodus, Sound und Vibro funktionieren nicht im Takt (Vibration pausiert für eine Weile).Android-Threads funktionieren nicht ordnungsgemäß im Hintergrundmodus

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

wie man sie synchronisiert?

P.S. Auch meine Vibrationen hören auf, wenn ich den Bildschirm sperre (aber der Ton geht weiter).


EDIT

Ich versuchte CyclicBarrier und gefunden zu verwenden, das Problem nicht in einem Thread war. Problem existiert wegen "nativer" Vibrationen, die home button hat. Also, wie ich verstehe, machen diese Vibrationen eine Schlange und deshalb verliert mein Metronom-Vibro das Tempo.

Was kann ich tun? Ich habe das Metronom Service bei der onStart und onStop Methode neu gestartet, aber es ist ungeschickt und es löst das Problem nicht, wenn ich auf menu-button klicke.

Antwort

0

Die einfachste Möglichkeit, mehrere Threads zu synchronisieren, ist die Verwendung eines CyclicBarrier. Die Idee ist, dass jeder Thread, nachdem er seinen Teil getan hat, await() aufruft und blockiert wird, bis der letzte ankommt, zu welchem ​​Zeitpunkt sie alle auf einmal freigegeben werden.

+0

danke für Ihre Antwort. Es hat nicht geholfen. Ich habe meinen Posten gewechselt. –

Verwandte Themen