开发者社区> 问答> 正文

java_lang_IllegalStateException该如何解决?


问题分析:
当一个方法在不合法或不恰当的时间被调用时抛出。
解决方案:
当一个方法在不合法或不恰当的时间被调用时抛出。建议根据状态图检查对象当前状态,更改错误的调用方法时机。
示例一:

  1. [backcolor=transparent]    java[backcolor=transparent].[backcolor=transparent]lang[backcolor=transparent].[backcolor=transparent]IllegalStateException
  2. [backcolor=transparent]      at io[backcolor=transparent].[backcolor=transparent]er[backcolor=transparent].[backcolor=transparent]yune[backcolor=transparent].[backcolor=transparent]MediaPlayer[backcolor=transparent].[backcolor=transparent]_reset[backcolor=transparent]([backcolor=transparent]Native[backcolor=transparent] [backcolor=transparent]Method[backcolor=transparent])
  3. [backcolor=transparent]      at io[backcolor=transparent].[backcolor=transparent]er[backcolor=transparent].[backcolor=transparent]yune[backcolor=transparent].[backcolor=transparent]MediaPlayer[backcolor=transparent].[backcolor=transparent]reset[backcolor=transparent]([backcolor=transparent]MediaPlayer[backcolor=transparent].[backcolor=transparent]java[backcolor=transparent]:[backcolor=transparent]734[backcolor=transparent])
  4. [backcolor=transparent]      at io[backcolor=transparent].[backcolor=transparent]er[backcolor=transparent].[backcolor=transparent]yune[backcolor=transparent].[backcolor=transparent]widget[backcolor=transparent].[backcolor=transparent]VideoView[backcolor=transparent].[backcolor=transparent]release[backcolor=transparent]([backcolor=transparent]VideoView[backcolor=transparent].[backcolor=transparent]java[backcolor=transparent]:[backcolor=transparent]502[backcolor=transparent])
  5. [backcolor=transparent]      at io[backcolor=transparent].[backcolor=transparent]er[backcolor=transparent].[backcolor=transparent]yune[backcolor=transparent].[backcolor=transparent]widget[backcolor=transparent].[backcolor=transparent]VideoView[backcolor=transparent].[backcolor=transparent]access$1500[backcolor=transparent]([backcolor=transparent]VideoView[backcolor=transparent].[backcolor=transparent]java[backcolor=transparent]:[backcolor=transparent]69[backcolor=transparent])
  6. [backcolor=transparent]      at io[backcolor=transparent].[backcolor=transparent]er[backcolor=transparent].[backcolor=transparent]yune[backcolor=transparent].[backcolor=transparent]widget[backcolor=transparent].[backcolor=transparent]VideoView$3[backcolor=transparent].[backcolor=transparent]surfaceDestroyed[backcolor=transparent]([backcolor=transparent]VideoView[backcolor=transparent].[backcolor=transparent]java[backcolor=transparent]:[backcolor=transparent]164[backcolor=transparent])
  7. [backcolor=transparent]      at android[backcolor=transparent].[backcolor=transparent]view[backcolor=transparent].[backcolor=transparent]SurfaceView[backcolor=transparent].[backcolor=transparent]updateWindow[backcolor=transparent]([backcolor=transparent]SurfaceView[backcolor=transparent].[backcolor=transparent]java[backcolor=transparent]:[backcolor=transparent]594[backcolor=transparent])
  8. [backcolor=transparent]      at android[backcolor=transparent].[backcolor=transparent]view[backcolor=transparent].[backcolor=transparent]SurfaceView[backcolor=transparent].[backcolor=transparent]onWindowVisibilityChanged[backcolor=transparent]([backcolor=transparent]SurfaceView[backcolor=transparent].[backcolor=transparent]java[backcolor=transparent]:[backcolor=transparent]239[backcolor=transparent])
  9. [backcolor=transparent]      at android[backcolor=transparent].[backcolor=transparent]view[backcolor=transparent].[backcolor=transparent]View[backcolor=transparent].[backcolor=transparent]dispatchWindowVisibilityChanged[backcolor=transparent]([backcolor=transparent]View[backcolor=transparent].[backcolor=transparent]java[backcolor=transparent]:[backcolor=transparent]8170[backcolor=transparent])
  10. [backcolor=transparent]      at android[backcolor=transparent].[backcolor=transparent]view[backcolor=transparent].[backcolor=transparent]ViewGroup[backcolor=transparent].[backcolor=transparent]dispatchWindowVisibilityChanged[backcolor=transparent]([backcolor=transparent]ViewGroup[backcolor=transparent].[backcolor=transparent]java[backcolor=transparent]:[backcolor=transparent]1113[backcolor=transparent])
  11. [backcolor=transparent]      at android[backcolor=transparent].[backcolor=transparent]view[backcolor=transparent].[backcolor=transparent]ViewGroup[backcolor=transparent].[backcolor=transparent]dispatchWindowVisibilityChanged[backcolor=transparent]([backcolor=transparent]ViewGroup[backcolor=transparent].[backcolor=transparent]java[backcolor=transparent]:[backcolor=transparent]1113[backcolor=transparent])
  12. [backcolor=transparent]      at android[backcolor=transparent].[backcolor=transparent]view[backcolor=transparent].[backcolor=transparent]ViewGroup[backcolor=transparent].[backcolor=transparent]dispatchWindowVisibilityChanged[backcolor=transparent]([backcolor=transparent]ViewGroup[backcolor=transparent].[backcolor=transparent]java[backcolor=transparent]:[backcolor=transparent]1113[backcolor=transparent])
  13. [backcolor=transparent]      at android[backcolor=transparent].[backcolor=transparent]view[backcolor=transparent].[backcolor=transparent]ViewGroup[backcolor=transparent].[backcolor=transparent]dispatchWindowVisibilityChanged[backcolor=transparent]([backcolor=transparent]ViewGroup[backcolor=transparent].[backcolor=transparent]java[backcolor=transparent]:[backcolor=transparent]1113[backcolor=transparent])

问题分析:
这种异常是由于MediaPlayer的生命周期使用不正确,比如没有调用prepare等方法就先调用isPlaying等方法时,或非合法状态调用prepareAsyn,setDataSource方法时会抛出这种异常。
解决方案:由于MediaPlayer的生命周期使用不正确导致抛出的异常,建议阅读MediaPlayer的状态图,确认不同状态调用正确的函数。
代码示例:
步骤一:初始化操作
// 方案一:通过将音频文件添加到资源结构中的res/raw文件夹中。
  1. [backcolor=transparent]  [backcolor=transparent]MediaPlayer[backcolor=transparent] player [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]MediaPlayer[backcolor=transparent].[backcolor=transparent]create[backcolor=transparent]([backcolor=transparent]getApplicationContext[backcolor=transparent](),[backcolor=transparent] R[backcolor=transparent].[backcolor=transparent]raw[backcolor=transparent].[backcolor=transparent]music[backcolor=transparent]);

// 方案二:以file://开头的本地文件URI
  1. [backcolor=transparent]  [backcolor=transparent]MediaPlayer[backcolor=transparent] player [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]MediaPlayer[backcolor=transparent].[backcolor=transparent]create[backcolor=transparent]([backcolor=transparent]getApplicationContext[backcolor=transparent](),[backcolor=transparent] [backcolor=transparent]Uri[backcolor=transparent].[backcolor=transparent]parse[backcolor=transparent](“[backcolor=transparent]file[backcolor=transparent]:[backcolor=transparent]///sdcard/music/1.mp3”));

// 方案三:setDataSource方法
  1. [backcolor=transparent]  [backcolor=transparent]MediaPlayer[backcolor=transparent] player [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]new[backcolor=transparent] [backcolor=transparent]MediaPlayer[backcolor=transparent]();
  2. [backcolor=transparent]  player[backcolor=transparent].[backcolor=transparent]setDataSource[backcolor=transparent](“/[backcolor=transparent]sdcard[backcolor=transparent]/[backcolor=transparent]test[backcolor=transparent].[backcolor=transparent]3gp[backcolor=transparent]”);
  3. [backcolor=transparent]  player[backcolor=transparent].[backcolor=transparent]prepare[backcolor=transparent]();

步骤二:播放控制
关键状态及函数说明:
准备好MediaPlayer后,想要开始播放,必须调用start()方法。当此方法成功返回时,MediaPlayer的对象处于Started状态。
isPlaying()方法可以被调用来测试某个MediaPlayer对象是否在Started状态。而对一个已经处于Started 状态的MediaPlayer对象调用start()方法没有影响。
start()方法调用之后调用pause()方法并返回时, 播放可以被暂停会使MediaPlayer对象进入Paused状态。调用start()方法会让一个处于Paused状态的MediaPlayer对象从之前暂停的地方恢复播放。当调用start()方法返回的时候,MediaPlayer对象的状态会又变成Started状态。在Started与Paused状态的相互转换在内部的播放引擎中是异步的。所以可能需要一点时间在isPlaying()方法中更新状态,若在播放流内容,这段时间可能会有几秒钟。
调用stop()方法会停止播放,并且还会让一个处于Started,Paused,Prepared或PlaybackCompleted状态的MediaPlayer进入Stopped状态。
调用seekTo()方法可以调整播放的位置。seekTo(int)方法是异步执行的,所以它可以马上返回,但是实际的定位播放操作可能需要一段时间才能完成,尤其是播放流形式的音频/视频。当实际的定位播放操作完成之后,内部的播放引擎会调用客户端程序员提供的OnSeekComplete.onSeekComplete()回调方法。可以通过setOnSeekCompleteListener(OnSeekCompleteListener)方法注册。seekTo(int)方法也可以在其它状态下调用,比如Prepared,Paused和PlaybackCompleted状态。
播放位置可以调用getCurrentPosition()方法得到,它可以帮助如音乐播放器的应用程序不断更新播放进度。
  1. [backcolor=transparent]    [backcolor=transparent]private[backcolor=transparent] [backcolor=transparent]void[backcolor=transparent] startPlay[backcolor=transparent]()[backcolor=transparent] [backcolor=transparent]{
  2. [backcolor=transparent]        player[backcolor=transparent].[backcolor=transparent]start[backcolor=transparent]();
  3. [backcolor=transparent]    [backcolor=transparent]}
  4. [backcolor=transparent]    [backcolor=transparent]private[backcolor=transparent] [backcolor=transparent]void[backcolor=transparent] stopPlay[backcolor=transparent]()[backcolor=transparent] [backcolor=transparent]{
  5. [backcolor=transparent]        payer[backcolor=transparent].[backcolor=transparent]stop[backcolor=transparent]();
  6. [backcolor=transparent]    [backcolor=transparent]}
  7. [backcolor=transparent]    [backcolor=transparent]private[backcolor=transparent] [backcolor=transparent]void[backcolor=transparent] pausePlay[backcolor=transparent]()[backcolor=transparent] [backcolor=transparent]{
  8. [backcolor=transparent]        player[backcolor=transparent].[backcolor=transparent]pause[backcolor=transparent]();
  9. [backcolor=transparent]    [backcolor=transparent]}
  10. [backcolor=transparent]    [backcolor=transparent]private[backcolor=transparent] [backcolor=transparent]void[backcolor=transparent] goTo[backcolor=transparent]([backcolor=transparent]int[backcolor=transparent] pos[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]{
  11. [backcolor=transparent]       player[backcolor=transparent].[backcolor=transparent]seekTo[backcolor=transparent]([backcolor=transparent]pos[backcolor=transparent]);
  12. [backcolor=transparent]    [backcolor=transparent]}

步骤三:释放播放资源
当播放到流的末尾,播放就完成了。如果调用了setLooping(boolean)方法开启了循环模式,那么这个MediaPlayer对象会重新进入Started状态。
在播放结束时,应调用MediaPlayer的release()方法,释放播放程序所占用的资源。
  1. [backcolor=transparent]    [backcolor=transparent]private[backcolor=transparent] [backcolor=transparent]void[backcolor=transparent] release[backcolor=transparent]()[backcolor=transparent] [backcolor=transparent]{
  2. [backcolor=transparent]      [backcolor=transparent]if[backcolor=transparent]([backcolor=transparent]player [backcolor=transparent]!=[backcolor=transparent] [backcolor=transparent]null[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]{
  3. [backcolor=transparent]         player[backcolor=transparent].[backcolor=transparent]stop[backcolor=transparent]();
  4. [backcolor=transparent]         player[backcolor=transparent].[backcolor=transparent]release[backcolor=transparent]();
  5. [backcolor=transparent]         player [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]null[backcolor=transparent];
  6. [backcolor=transparent]      [backcolor=transparent]}
  7. [backcolor=transparent]    [backcolor=transparent]}

参考文献:
1.https://developer.android.com/reference/android/media/MediaPlayer.html#StateDiagram (MediaPlayer状态图)
2.https://developer.android.com/reference/android/media/MediaPlayer.html (MediaPlayer官方文档)
3.http://www.devdiv.com/Android-MediaPlayer%E7%9A%84%E4%BD%BF%E7%94%A8-thread-130166-1-1.html
4.http://blog.csdn.net/yearafteryear/article/details/8966221

展开
收起
猫饭先生 2017-10-25 10:38:11 1573 0
0 条回答
写回答
取消 提交回答
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
OpenCrypto Unchaining the Java 立即下载
Java Your(Next) 立即下载
EXTENDING SPARK WITH JAVA AGEN 立即下载