本文档涵盖两个可能出现问题的领域。
状态。对于 `Medialayer`,某些操作仅在特定状态下有效。不正确的操作可能导致异常或意外行为。
资源。当您进行配置更改(例如屏幕旋转)时,必须释放
MediaPlayer
对象以释放系统资源并避免资源耗尽。
管理状态
MediaPlayer
是基于状态的。也就是说,它有一个内部状态,您在编写代码时必须始终注意,因为某些操作仅在播放器处于特定状态时才有效。如果您在错误的状态下执行操作,系统可能会抛出异常或导致其他不必要的行为。
MediaPlayer
类文档中的状态图阐明了哪些方法将 MediaPlayer
从一个状态转移到另一个状态。例如:
- 当您创建一个新的
MediaPlayer
时,它处于空闲 (Idle) 状态。 - 您通过调用
setDataSource()
来初始化它,这会将其更改为已初始化 (Initialized) 状态。 - 您可以使用
prepare()
或prepareAsync()
方法来准备它。 - 当
MediaPlayer
准备完成后,它将进入Prepared
(已准备) 状态,这意味着您可以调用start()
来使其播放媒体。
此时,如状态图所示,您可以通过调用 start()
、pause()
和 seekTo()
等方法,在 Started
(已启动)、Paused
(已暂停) 和 PlaybackCompleted
(播放完成) 状态之间切换。
但是,当您调用 stop()
时,请注意,在再次准备 MediaPlayer
之前,您无法再次调用 start()
。
在编写与 MediaPlayer
对象交互的代码时,请始终牢记状态图,因为在错误的状态下调用其方法是导致错误常见原因。
释放 MediaPlayer
一个 MediaPlayer
可以消耗宝贵的系统资源。因此,您应该始终采取额外的预防措施,确保不会不必要地占用 MediaPlayer
实例。当您使用完毕后,应始终调用 release()
以确保分配给它的任何系统资源都已正确释放。
例如,如果您正在使用 MediaPlayer
并且您的 activity 收到对 onStop()
的调用,您必须释放 MediaPlayer
,因为在您的 activity 不与用户交互时(除非您在后台播放媒体,这将在下一节中讨论)继续持有它没有什么意义。
当然,当您的 activity 恢复或重新启动时,您需要创建一个新的 MediaPlayer
并重新准备它,然后才能恢复播放。
以下是您应该如何释放然后将 MediaPlayer
置空的方法:
Kotlin
mediaPlayer?.release()
mediaPlayer = null
Java
mediaPlayer.release();
mediaPlayer = null;
例如,考虑一下如果您在 activity 停止时忘记释放 MediaPlayer
,但在 activity 再次启动时又创建一个新的 MediaPlayer
所产生的问题。当用户改变屏幕方向(或以其他方式改变设备配置)时,系统默认会重新启动 activity。您可能会很快耗尽所有系统资源,因为用户在纵向和横向之间来回旋转设备时,每次方向改变都会创建一个新的 MediaPlayer
,而您从未释放过它。
有关运行时重启的更多信息,请参阅处理运行时更改。
您可能想知道,即使在用户离开您的 activity 后,如果您想继续播放“后台媒体”,就像内置的音乐应用那样,会发生什么。在这种情况下,您需要一个由 Service 控制的 MediaPlayer
,这将在下一节中讨论。
了解详情
Jetpack Media3 是您的应用中媒体播放的推荐解决方案。阅读更多相关信息。
这些页面涵盖了与录制、存储和播放音频和视频相关的主题