MediaPlayer.create()
может быть довольно дорогим звонком.Подумайте, что произойдет, если это займет примерно 100 мс (или даже больше):
- Таймер вызывает
onTick()
. onTick()
блоков в течение примерно 100 мс внутри MediaPlayer.create()
. mp
начинает играть, а onTick()
возвращается.(Пока все хорошо!) - Немедленно таймер понимает, что еще один
onTick()
вызов подлежит!Последний начался более 100 мс назад! onTick()
вызывается снова, почти сразу.Очень быстро он достигает звонка stopPlaying()
.Но вы только начали , играя около 1 мс назад!
Это приводит к ситуации, когда ваш таймер тратит все свое время на MediaPlayer.create()
, и практически не играет времени за воспроизведение звука.
Обратите внимание, что при написанном коде он будет пытаться воспроизвести звук приблизительно 30 раз за последние 3 секунды обратного отсчета (поскольку такты в идеале находятся на расстоянии 100 мс).Если ваше намерение состояло в том, чтобы воспроизвести звук только 3 раза, вы можете переместить второй блок if
внутрь первого.Таким образом, вы пытаетесь играть, только когда secondsLeft
действительно изменяется.Это на самом деле улучшит исходную проблему, и вам, возможно, не понадобятся дальнейшие изменения.
Но если вы хотите оптимизировать дальше, учтите, что вы можете подготовить mp
заранее - скажем, при запуске приложения- и просто используйте его снова: вместо release()
- каждый раз, просто stop()
и prepare()
(и не reset()
это).Это оставит это готовым к следующей игре.Вы даже можете создать отдельный MediaPlayer
только для beepend
и подготовить их оба во время инициализации приложения.