管理 MediaPlayer 状态和资源

本文档涵盖两个可能出现问题的领域。

  • 状态。对于 `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 是您的应用中媒体播放的推荐解决方案。阅读更多相关信息。

这些页面涵盖了与录制、存储和播放音频和视频相关的主题