Управление состоянием и ресурсами MediaPlayer

В данном документе рассматриваются две области, в которых могут возникнуть потенциальные проблемы.

  • Состояние. В случае с "Medialayer" определенные операции допустимы только в определенных состояниях. Неправильные операции могут привести к исключениям или неожиданному поведению.

  • При внесении изменений в конфигурацию , таких как поворот экрана, необходимо освободить объект MediaPlayer , чтобы освободить системные ресурсы и избежать их исчерпания.

Управление состоянием

MediaPlayer — это проигрыватель, работающий на основе состояния. То есть, у него есть внутреннее состояние, о котором вы всегда должны помнить при написании кода, поскольку определенные операции допустимы только тогда, когда проигрыватель находится в определенных состояниях. Если вы выполните операцию, находясь в неправильном состоянии, система может выдать исключение или вызвать другие нежелательные последствия.

Диаграмма состояний в документации класса MediaPlayer поясняет, какие методы переводят MediaPlayer из одного состояния в другое. Например:

  • При создании нового MediaPlayer он находится в состоянии ожидания (Idle ).
  • Инициализация осуществляется вызовом метода setDataSource() , который переводит объект в состояние Initialized .
  • Вы можете подготовить его, используя либо метод prepare() , либо метод prepareAsync() .
  • Когда MediaPlayer завершит подготовку, он перейдет в состояние Prepared , что означает, что вы можете вызвать start() для воспроизведения медиафайлов.

На этом этапе, как показано на диаграмме, вы можете переключаться между состояниями Started , Paused и PlaybackCompleted , вызывая такие методы, как start() , pause() и seekTo() , а также другие.

Однако, при вызове функции stop() обратите внимание, что вы не сможете снова вызвать start() пока не подготовите MediaPlayer заново.

При написании кода, взаимодействующего с объектом MediaPlayer , всегда помните о диаграмме состояний , поскольку вызов его методов из неправильного состояния является распространенной причиной ошибок.

Откройте медиаплеер

MediaPlayer может потреблять ценные системные ресурсы. Поэтому всегда следует принимать дополнительные меры предосторожности, чтобы не задерживать экземпляр MediaPlayer дольше, чем необходимо. После завершения работы с ним всегда следует вызывать release() чтобы убедиться, что все выделенные ему системные ресурсы должным образом освобождены.

Например, если вы используете MediaPlayer и ваше приложение получает вызов onStop() , вам необходимо освободить MediaPlayer , поскольку нет смысла удерживать его, пока ваше приложение не взаимодействует с пользователем (если только вы не воспроизводите медиафайлы в фоновом режиме, что обсуждается в следующем разделе).

Разумеется, при возобновлении или перезапуске воспроизведения необходимо создать новый MediaPlayer и заново его подготовить перед продолжением воспроизведения.

Вот как следует освободить, а затем обнулить ваш MediaPlayer :

Котлин

mediaPlayer?.release()
mediaPlayer = null

Java

mediaPlayer.release();
mediaPlayer = null;

В качестве примера рассмотрим проблемы, возникающие, если вы забываете освободить MediaPlayer при завершении активности, но создаете новый при повторном запуске. Когда пользователь меняет ориентацию экрана (или иным образом изменяет конфигурацию устройства), система по умолчанию перезапускает активность. Вы можете быстро израсходовать все системные ресурсы, поскольку пользователь поворачивает устройство между портретным и альбомным режимами, так как при каждом изменении ориентации создается новый MediaPlayer , который вы никогда не освобождаете.

Для получения дополнительной информации о перезапуске во время выполнения см. раздел «Обработка изменений во время выполнения» .

Возможно, вас интересует, что произойдет, если вы захотите продолжить воспроизведение «фонового мультимедиа» даже после того, как пользователь покинет ваше приложение, подобно тому, как это делает встроенное приложение «Музыка». В этом случае вам понадобится MediaPlayer управляемый службой, как будет описано в следующем разделе.

Узнать больше

Jetpack Media3 — рекомендуемое решение для воспроизведения мультимедиа в вашем приложении. Узнайте больше об этом.

На этих страницах рассматриваются вопросы, касающиеся записи, хранения и воспроизведения аудио- и видеоматериалов: