Звук начинается снова и снова

#java #android

Вопрос:

У меня есть свойство, которое установлено следующим образом:

 private MediaPlayer _standBy = null;  

Теперь я хотел бы использовать это свойство в своей функции playSound() .

 private void playSound() {  if (_standBy == null || !_standBy.isPlaying()) {  _standBy = MediaPlayer.create(_context, R.raw.turbine);  _standBy.start();  } }  

Эта функция будет выполняться всякий раз, когда я нажимаю на кнопку, и звук должен воспроизводиться только один раз, независимо от того, сколько раз я нажимаю на эту кнопку. Что ж, это прекрасно работает. Но поскольку я повторяю этот код снова и снова, но с разными свойствами, я хотел бы вставить этот код в другую функцию. Вот как я это попробовал:

 private void customizeSound(MediaPlayer mediaplayer) {  if (mediaplayer== null || !mediaplayer.isPlaying()) {  mediaplayer= MediaPlayer.create(_context, R.raw.turbine);  mediaplayer.start();  } }  

Итак, теперь playSound() это выглядит так:

 private void playSound() {  customizeSound(_standBy); }  

И теперь, когда я нажимаю на эту кнопку, функция customizeSound(_standBy) будет выполняться, но при каждом нажатии на эту кнопку будет запускаться один и тот же звук.

Что не так с моим кодом?

Комментарии:

1. Вы имеете в виду перезапуск каждый раз (начиная с самого начала)?

2. @Zain нет, на самом деле не перезапущен. Тот же звук будет воспроизводиться с самого начала, пока старый звук все еще воспроизводится. Я хочу избежать воспроизведения одного и того же звука несколько раз одновременно.

Ответ №1:

Возможно, вам не всегда следует создавать экземпляр MediaPlayer, его следует создавать только тогда, когда он равен нулю.

 if (mediaplayer == null) {  mediaplayer = MediaPlayer.create(_context, R.raw.turbine); } mediaplayer.start();  

И когда он не равен нулю, вы можете переключить поведение с помощью isPlaying :

 if (mediaplayer.isPlaying()) {  mediaplayer.seekTo(0); } mediaplayer.start();  

Так что эти двое в одном могут быть похожи:

 if (mediaplayer == null) {  mediaplayer = MediaPlayer.create(_context, R.raw.turbine); } else if (mediaplayer.isPlaying()) {  mediaplayer.seekTo(0); } mediaPlayer.start();  

Ваш playSound() метод использует переменную поля (область действия имеет широкий класс), в то время customizeSound как метод использует локальную переменную (область действия ограничена в блоке метода). Вот почему последний создает несколько экземпляров.

Ответ №2:

Попробуйте изменить условие на только в том случае, если медаплеер null :

 private void customizeSound(MediaPlayer mediaplayer) {  if (mediaplayer== null) {  mediaplayer= MediaPlayer.create(_context, R.raw.turbine);  mediaplayer.start();  } }  

Но для этого необходимо установить значение null, когда все закончится:

 mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {  @Override  public void onCompletion(MediaPlayer mp) {  mediaplayer = null;  } });