MediaPlayer之生命周期解析

来源:互联网 发布:淘宝店铺月度运营计划 编辑:程序博客网 时间:2024/05/29 09:25



(1)Idle:当new构造噐或者调用reset方法之后,MediaPlayer进入Idle状态。这两种方法不同之处在于,new进入的Idle状态在调用除setDataSource()以外的方法时状态不改变,而reset()会回调OnErrorListener.onError()方法,并且进入Error状态。(所以官网上Valid and invalid states表格中Valid states下的Idle其实是指由new进入的Idle状态)。另外,由create方法创建对象进入的不是Idle状态,而是Prepared状态。


(2)End:当MediaPlayer不再使用时,建议调用release()马上释放其占用的资源。调用release()之后进入End状态,此时,MediaPlayer已无效,不能回退到任何其他状态。


(3)Error:当出现方法调用或编程错误时,OnErrorListener.onError()被调用,并且进入Error状态,所以总是建议注册OnErrorListener。事实上,即使没有注册OnErrorListener,当错误发生时也会进入Error状态。另外,方法调用错误还会抛出IllegaStateException.


(4)Initalized:调用setDataSource()系列重载方法进入 Initalized状态,任何其他状态调用这些方法将抛出异常


(5)Preparing和Prepared:在MediaPlayer启动播放(start)之前必须先进入Prepared状态。prepare()调用结束直接进入Prepared状态,一般来说prepared过程会需要很长一段事件,如果这个工作发生在UI线程,则会很容易产生ANR。所以应该开辟另外一个线程进行这些准备工作。而调用prepareAsync()先进入Preparing状态,Preparing是一个暂时状态,进行一些准备工作,之后才会进入Prepared状态。prepareAsync中的准备工作是在后台执行的,所以比prepare()更加方便。进入Preapred状态会回调OnPreparedListener.onPrepared()方法。注意在Preparing状态调用任何方法的后果是不可预见的。其他状态下调用 prepare()或prepareAsync()会抛出异常。在Prepared状态下,就可以进行一些set属性操作了。


(6)Started:调用start()进入Started状态,回调onBufferingUpdateListener.onBufferingUpdate().此时调用isPlayer()返回true。


(7)Paused:调用pause()进入Paused()状态。Started和Paused之间的状态转换是异步的,所以在isPlaying()之前会需要更新时间。此时调用start()可以返回start状态。


(8)Stoped:调用stop进入Stoped状态.如果想再进入start状态,之前先调用prepared()或prepareAsync()进入prepared状态


(9)PlayBackConpleted:当播放结束时,如果 setLooping(true),则保持start状态;如果setLooping(false)则进入 PlayBackConpleted状态,并且回调onCompletionListener.onCompletion()。此时调用start()可以返回start状态


另外:

在 Prepared、Started、 Paused、 PlayBackConpleted都能调用异步的seekTo(),此方法马上返回,但是实际会花费一些时间去完成操作,当这些操作完成,回调onSeekCompleteListener.onSeekComplete()。实际的播放位置还能通过getCurrentposition()来获得。


详解内容参考谷官网:http://developer.android.com/reference/android/media/MediaPlayer.html

0 0
原创粉丝点击