Как синхронизировать метод?

Имею задачу синхронизировать метод. Пробовал с wait()/notify() и семафорами. В итоге, блокировка срабатывает как надо, но при этом метод onCompletion() не вызывается и, как следствие, блокировка не снимается. Как быть?

Object lock = new Object();

    public void playSound(String path) {
        Uri myUri = Uri.parse(path);
        MediaPlayer mp = MediaPlayer.create(context, myUri);
        mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                mp.stop();
                mp.release();
                lock.notifyAll();
            }
        });
        mp.start();
        
            try {
                lock.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    }
  • Вопрос задан
  • 3079 просмотров
Пригласить эксперта
Ответы на вопрос 4
LeoCcoder
@LeoCcoder
Документация:
«In order to receive the respective callback associated with these listeners, applications are required to create MediaPlayer objects on a thread with its own Looper running»

Если в этом предложении есть незнакомые слова — советую все изучить, тогда будет понятно почему не работает.

Скорее всего lock.wait(); блокирует поток и сообщения больше не обрабатываются, поэтому никаких колбеков бы больше не получаете (если у вас вообще есть Looper в потоке, покажите в каком потоке вы создаете плеер). Если у вас нет Looper'a в потоке, то даже без блокировок никаких колбеков вы не получите назад.
Ответ написан
Комментировать
AR1ES
@AR1ES
Хм, если речь идет именно о синхронизации метода, то просто объявление его как synchronized не подходит?
Ответ написан
bartwell
@bartwell Автор вопроса
Если у вас нет Looper'a в потоке, то даже без блокировок никаких колбеков вы не получите назад

Looper есть и без блокировки OnCompletionListener() работает нормально.

Скорее всего lock.wait(); блокирует поток и сообщения больше не обрабатываются, поэтому никаких колбеков бы больше не получаете

Очень на то похоже. А как это исправить?
Ответ написан
bartwell
@bartwell Автор вопроса
Со списком Uri мне не подходит: между звуками могут вызываться другие методы.
Моя же задача состоит в том, что мне нужно отследить конец проигрывания мелодии и только после этого производить дальнейшие действия. Метод этот вызывается с помощью Method.invoke(). Соответственно, ждать нужно либо внутри метода либо сразу после invoke(), других вариантов нет. Но это один и тот же поток ведь…
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы