【Android笔记】Android MediaPlayer的生命周期

Android MediaPlayer的生命周期

MediaPlayer的状态转换图也表征了它的生命周期,搞清楚这个图可以帮助我们在使用MediaPlayer时考虑情况更周全,写出的代码也更具健壮性。

 


 

这张状态转换图清晰的描述了MediaPlayer的各个状态,也列举了主要的方法的调用时序,每种方法只能在一些特定的状态下使用,如果使用时MediaPlayer的状态不正确则会引发IllegalStateException异常

 

Idle 状态:当使用new()方法创建一个MediaPlayer对象或者调用了其reset()方法时,该MediaPlayer对象处于idle状态。这两种方法的一个重要差别就是:如果在这个状态下调用了getDuration()等方法(相当于调用时机不正确),通过reset()方法进入idle状态的话会触发OnErrorListener.onError(),并且MediaPlayer会进入Error状态;如果是新创建的MediaPlayer对象,则并不会触发onError(),也不会进入Error状态。

 

End 状态:通过release()方法可以进入End状态,只要MediaPlayer对象不再被使用,就应当尽快将其通过release()方法释放掉,以释放相关的软硬件组件资源,这其中有些资源是只有一份的(相当于临界资源)。如果MediaPlayer对象进入了End状态,则不会在进入任何其他状态了。

 

Initialized 状态:这个状态比较简单,MediaPlayer调用setDataSource()方法就进入Initialized状态,表示此时要播放的文件已经设置好了。

 

Prepared 状态:初始化完成之后还需要通过调用prepare()prepareAsync()方法,这两个方法一个是同步的一个是异步的,只有进入Prepared状态,才表明MediaPlayer到目前为止都没有错误,可以进行文件播放。

 

Preparing 状态:这个状态比较好理解,主要是和prepareAsync()配合,如果异步准备完成,会触发OnPreparedListener.onPrepared(),进而进入Prepared状态。

 

Started 状态:显然,MediaPlayer一旦准备好,就可以调用start()方法,这样MediaPlayer就处于Started状态,这表明MediaPlayer正在播放文件过程中。可以使用isPlaying()测试MediaPlayer是否处于了Started状态。如果播放完毕,而又设置了循环播放,则MediaPlayer仍然会处于Started状态,类似的,如果在该状态下MediaPlayer调用了seekTo()或者start()方法均可以让MediaPlayer停留在Started状态。

 

Paused 状态:Started状态下MediaPlayer调用pause()方法可以暂停MediaPlayer,从而进入Paused状态,MediaPlayer暂停后再次调用start()则可以继续MediaPlayer的播放,转到Started状态,暂停状态时可以调用seekTo()方法,这是不会改变状态的。

 

Stop 状态:Started或者Paused状态下均可调用stop()停止MediaPlayer,而处于Stop状态的MediaPlayer要想重新播放,需要通过prepareAsync()prepare()回到先前的Prepared状态重新开始才可以。

 

PlaybackCompleted状态:文件正常播放完毕,而又没有设置循环播放的话就进入该状态,并会触发OnCompletionListeneronCompletion()方法。此时可以调用start()方法重新从头播放文件,也可以stop()停止MediaPlayer,或者也可以seekTo()来重新定位播放位置。

 

Error状态:如果由于某种原因MediaPlayer出现了错误,会触发OnErrorListener.onError()事件,此时MediaPlayer即进入Error状态,及时捕捉并妥善处理这些错误是很重要的,可以帮助我们及时释放相关的软硬件资源,也可以改善用户体验。通过setOnErrorListener(android.media.MediaPlayer.OnErrorListener)可以设置该监听器。如果MediaPlayer进入了Error状态,可以通过调用reset()来恢复,使得MediaPlayer重新返回到Idle状态。

 

参考文档:AndroidSDK1.5官方文档:android-sdk-windows-1.5_r3/docs/reference/android/media/MediaPlayer.html

  • 14
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: MediaPlayerAndroid平台上的一个媒体播放器类,它的生命周期包括以下几个阶段: 1. 创建MediaPlayer对象,通过调用create()方法来完成; 2. 设置数据源,通过调用setDataSource()方法来完成,可以是本地文件、网络资源或者流; 3. 准备MediaPlayer,通过调用prepare()方法来完成,准备阶段可能需要一些时间,如果需要异步准备可以调用prepareAsync()方法; 4. 开始播放,通过调用start()方法来完成,MediaPlayer会进入播放状态; 5. 暂停播放,通过调用pause()方法来完成,MediaPlayer会进入暂停状态,可以通过调用start()方法来恢复播放; 6. 停止播放,通过调用stop()方法来完成,MediaPlayer会进入停止状态,需要重新准备才能继续播放; 7. 释放MediaPlayer资源,通过调用release()方法来完成,释放MediaPlayer对象和相关资源。 在实际使用过程中,需要注意MediaPlayer对象的生命周期,确保在不需要使用时及时释放资源,以免出现内存泄漏等问题。 ### 回答2: MediaPlayer是安卓开发中常用的一个多媒体播放器类,它有以下的生命周期: 1. 创建和实例化:创建一个MediaPlayer对象,并进行实例化。这个过程通常在Activity或Fragment的创建阶段完成,可以在onCreate()方法中进行。 2. 设置资源和准备:由于MediaPlayer需要播放的内容,比如音频或视频资源,所以在开始播放前需要设置相关的资源路径或URI。然后调用prepare()或prepareAsync()方法,将资源准备好。prepare()是同步方法,会直到资源准备完成后再继续执行,而prepareAsync()是异步方法,不会阻塞主线程,可以通过设置OnPreparedListener监听器等待资源准备完成。 3. 开始播放或暂停:调用start()方法开始播放,MediaPlayer会根据资源的类型自动选择对应的播放器进行播放。调用pause()方法可以暂停播放,可以在需要暂停时调用。 4. 停止播放:调用stop()方法停止播放,停止后可以选择重新设置资源并准备,或者释放MediaPlayer对象。 5. 重置:调用reset()方法可以将MediaPlayer对象重置到初始状态,清除所有资源和缓存,并释放MediaPlayer对象。 6. 释放:调用release()方法可以释放MediaPlayer对象,释放相关资源和系统资源,这样可以节约内存和系统资源,通常在播放完成后或Activity销毁前调用。 7. 错误处理:当MediaPlayer发生错误时,会回调OnErrorListener监听器,可以在此处理错误情况,进行一些逻辑处理或提示用户。 总结:MediaPlayer生命周期包括了创建和实例化、设置资源和准备、开始播放或暂停、停止播放、重置、释放和错误处理等多个阶段,开发者根据需要调用对应的方法完成播放控制,并根据回调监听器处理错误情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值