-1

Я пытаюсь реализовать свой MediaPlayer в службе, и до сих пор все работало нормально. Однако есть один сценарий, в котором происходит сбой приложения.MediaPlayer в сервисе, вызывающем исключение IllegalStateException и сбой приложений

Вот сценарий:

  • Я ищу художник, и отображается список с результатами
  • я выбираю художник, и отображаются главные дорожки художника (на другую деятельности)
  • Я нажимаю на дорожку, открывается мой диалог, моя служба запускается, и начинается воспроизведение песни.
  • Я нажимаю кнопку «Назад», и «Диалог» уничтожается. Песня все еще играет.
  • Я снова нажимаю кнопку «Назад», которая возвращает меня к экрану результатов работы художника. Песня перестает играть.
  • Я выбрал другого (или того же) художника. Новый экран отображается с верхними дорожками.
  • Когда я нажимаю на дорожку, ДОЛЖЕН делать то, что было раньше - откройте диалоговое окно DialogFragment и воспроизведите песню, однако приложение выйдет из строя.

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

Это заставляет меня поверить, что Служба потеряла ссылку на MediaPlayer?

Это метод моего DialogFragment, который получит сервис после подключения к нему, а затем вызовет PlayTrack() на моей службе, которая сначала сбрасывает плеер (вот где происходит исключение), а затем воспроизводит песню.

private ServiceConnection mediaPlayerConnection = new ServiceConnection() { 
    @Override 
    public void onServiceConnected(ComponentName name, IBinder service) { 
     MusicBinder binder = (MusicBinder) service; 
     mMediaPlayerService = binder.getService(); 
     mMediaPlayerService.setPlayList(mTracks); 
     mMediaPlayerService.setCurrentSong(currentTrack); 
     updateMediaPlayerViews(); 
     mMediaPlayerService.playTrack(); 
     isMediaPlayerBound = true; 
    } 

    @Override 
    public void onServiceDisconnected(ComponentName name) { 
     isMediaPlayerBound = false; 
    } 
}; 

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

Любая помощь была бы чрезвычайно оценена. Спасибо!

ответ

0

Ok. Я нашел проблему.

На мой метод onUnbind, я вызываю .release() на моем медиаплеере. Позже, когда я снова привяжусь к своему сервису и попытаюсь воспроизвести новую песню, я не могу вызвать .reset() на моем медиаплеере, потому что это неверно в текущем состоянии проигрывателя.

Вы можете вызывать .reset(), когда ваш плеер находится в «активном» состоянии, иначе после вызова функции .start().