e()等。需要注意的是,在不需要播放的时候要及时释放掉与Mediaplayer对象相连接的播放文件[7]。图2-2显示了一个Mediaplayer对象被支持的播放控制操作驱动的生命周期和状态。椭圆标识代表Mediaplayer对象可能主流的状态。由一个箭头开始的弧线代表同步的方法调用,而以双箭头开头的弧线代表异步调用方法。通过图2-2可以知道一个Mediaplayer对象有如下状态。当一个MediaPlayer对象被刚刚用new操作符创建或是调用了reset()方法后,它就处于Idle状态。当调用了release()方法后,它就处于End状态。这两种状态之间的时间是MediaPlayer对象的生命周期。在一个新构建的MediaPlayer对象和一个调用了reset()方法的MediaPlayer对象之间有个微笑但十分重要的差别。在Idle状态时,调用getCurrentPosition()、getDuration()、getVideoHeight()、getVideoWidth()、setAudioStreamType(int)、setLooping(boolean)、setVolume(float,float)、pause()、start()、stop()、seekTo(int)、prepare()或者是prepareAsync()方法都是编程错误。当一个MediaPlayer对象处于刚被创建的时候,内部的播放引擎和对象的状态都没有改变,在这个时候调用以上方法,框架将无法回调客户端程序注册的OnErrorListener.onError()方法;但若这个MediaPlayer对象调用了reset()方法之后,再调用7以上方法,内部的播放引擎就会回调客户端注册的OnErrorListener.onError()方法,并将错误的状态传入。图2-2Mediaplayer对象状态