Причина, по которой вы испытываете другое поведение, если логическое значение mediaPlaying
будет иметь разные значения при нажатии кнопки остановки. Он остановит игрока, только если значение равно true, и если вы нажмете «Стоп», когда игрок остановлен, это будет false
, поэтому ваш код не остановит игрока.
Я предлагаю добавить PlayerState enum для например (PLAYING, STOPPED, PAUSED) вместо использования логических значений. Тогда вам будет проще узнать, в каком состоянии находится игрок и какие действия предпринять.
In в коде
public enum PlayerState {
PLAYING,
STOPPED,
PAUSED
}
Затем вы создаете переменную и устанавливаете начальное состояние (так же, как вы делаете для mediaPlaying (и в том же месте в вашем приложении))
private PlayerState state = PlayerState.STOPPED;
, а затем в своем коде вы заменяете места, где вы управляете mediaPlaying, и заменяете if (mediaPlaying) на if- операторы типа
if (state == PlayerState.PLAYING) { ...
Как только это будет сделано, вам больше не понадобится логическое mediaPlaying. И у вас есть более точные сведения о состоянии медиаплеера в ваших приложениях.
Какой-то код состояния, сложный, поскольку у меня нет всего кода. В каждом случае проверьте переход состояния, а затем установите состояние (которого нет в вашем коде)
case R.id.playBtn:
if (state == PlayerState.PLAYING){
// logic here for going from playing to paused
state = PlayerState.PAUSED;
} else if (state != PlayerState.PLAYING){
// logic from non playing to playing
state = PlayerState.PLAYING;
}
break;
case R.id.stopBtn:
if (state == PlayerState.PLAYING){
// logic if playing
} else if (state == PlayerState.PAUSED){
// logic if paused
}
state = PlayerState.STOPPED;
break;