#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; } });