我正在尝试制作一个节拍器。它有声音和振动。 Service
启动节拍器,启动声音后振动是同步的,但是当我点击home button
时,将节拍器转到背景模式,声音和振动对节拍不起作用(振动暂停一段时间。
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。如果我锁定屏幕,我的振动也会停止(但声音仍在继续)。
修改
我尝试使用CyclicBarrier
并发现,该问题不在线程中。由于home button
具有“原生”振动,存在问题。所以,据我所知,这些振动排成一列,因此我的节拍器振动会失去节奏。
我该怎么办?我已经在Service
和onStart
方法重新启动了节拍器onStop
,但是当我点击menu-button
时,它很笨拙并且无法解决问题
答案 0 :(得分:0)
我知道同步多个线程的最简单方法是使用CyclicBarrier。我的想法是,在完成自己的工作后,每个线程都会调用await()
并被阻塞,直到最后一个线程到达,此时它们全部被释放。