Android线程在后台模式下无法正常运行

时间:2016-03-22 14:31:37

标签: android multithreading android-vibration

我正在尝试制作一个节拍器。它有声音和振动。 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具有“原生”振动,存在问题。所以,据我所知,这些振动排成一列,因此我的节拍器振动会失去节奏。

我该怎么办?我已经在ServiceonStart方法重新启动了节拍器onStop,但是当我点击menu-button时,它很笨拙并且无法解决问题

1 个答案:

答案 0 :(得分:0)

我知道同步多个线程的最简单方法是使用CyclicBarrier。我的想法是,在完成自己的工作后,每个线程都会调用await()并被阻塞,直到最后一个线程到达,此时它们全部被释放。