调用MediaPlayer.reset()的IllegalStateException

sky*_*ler 19 android media-player

Android的文档MediaPlayer显示该reset()调用没有无效状态:http://developer.android.com/reference/android/media/MediaPlayer.html#Valid_and_Invalid_States(无效状态列为{}或"无" ").

但是,我看到IllegalStateException在调用时抛出reset():

java.lang.IllegalStateException
at android.media.MediaPlayer._reset(Native Method)
at android.media.MediaPlayer.reset(MediaPlayer.java:1061)
at com.example.android.player.AsyncPlayer$AsyncHandler.handleMessage(AsyncPlayer.java:654)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.os.HandlerThread.run(HandlerThread.java:60)
Run Code Online (Sandbox Code Playgroud)

文档不正确吗?

den*_*eli 27

很难说没有看到你的代码,但我认为你可能在调用release()后调用reset()?

文件说明

当一个MediaPlayer对象刚刚使用new创建或者在调用reset()之后,它处于空闲状态; 并且在调用release()之后,它处于End状态.在这两个状态之间是MediaPlayer对象的生命周期.

您可能在有效生命周期之外调用重置.

  • 是的,在release()之后调用reset()将抛出非法状态异常 (12认同)

Cha*_*ltz 8

我遇到了你的问题,Skyler.

你是对的.文档显示mediaPlayer.reset()没有无效状态,但这不是文档中的第一个不准确之处.

我注意到的是VALID状态列表没有说"Any"; 它列出了除两个以外的每个特定状态:准备和结束.

我试验过,但是当MediaPlayer希望处于Preparation状态(使用prepareAsync())时,我试图调用release()时不会引发IllegalStateException.我不保证它不会发生,但我无法实现.我在该实例中看到的是以下日志消息:

04-11 11:41:54.740: E/MediaPlayer(4930): error (1, -2147483648)
04-11 11:41:54.748: E/MediaPlayer(4930): Error (1,-2147483648)
Run Code Online (Sandbox Code Playgroud)

是的,两个错误消息都出现,一个接着一个 - 小写"错误",一个大写"错误",但没有抛出异常.

但是,如果我在release()之后调用reset(),那么我得到错误:

04-11 11:45:05.232: E/AndroidRuntime(5046): FATAL EXCEPTION: main
04-11 11:45:05.232: E/AndroidRuntime(5046): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.helloandroid/com.android.helloandroid.HelloAndroidActivity}: java.lang.RuntimeException: java.lang.IllegalStateException
04-11 11:45:05.232: E/AndroidRuntime(5046):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1696)
04-11 11:45:05.232: E/AndroidRuntime(5046):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1716)
04-11 11:45:05.232: E/AndroidRuntime(5046):     at android.app.ActivityThread.access$1500(ActivityThread.java:124)
04-11 11:45:05.232: E/AndroidRuntime(5046):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:968)
04-11 11:45:05.232: E/AndroidRuntime(5046):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-11 11:45:05.232: E/AndroidRuntime(5046):     at android.os.Looper.loop(Looper.java:123)
04-11 11:45:05.232: E/AndroidRuntime(5046):     at android.app.ActivityThread.main(ActivityThread.java:3806)
04-11 11:45:05.232: E/AndroidRuntime(5046):     at java.lang.reflect.Method.invokeNative(Native Method)
04-11 11:45:05.232: E/AndroidRuntime(5046):     at java.lang.reflect.Method.invoke(Method.java:507)
04-11 11:45:05.232: E/AndroidRuntime(5046):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-11 11:45:05.232: E/AndroidRuntime(5046):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-11 11:45:05.232: E/AndroidRuntime(5046):     at dalvik.system.NativeStart.main(Native Method)
04-11 11:45:05.232: E/AndroidRuntime(5046): Caused by: java.lang.RuntimeException: java.lang.IllegalStateException
04-11 11:45:05.232: E/AndroidRuntime(5046):     at com.android.helloandroid.HelloAndroidActivity.crashMediaPlayer(HelloAndroidActivity.java:423)
04-11 11:45:05.232: E/AndroidRuntime(5046):     at com.android.helloandroid.HelloAndroidActivity.onCreate(HelloAndroidActivity.java:87)
04-11 11:45:05.232: E/AndroidRuntime(5046):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-11 11:45:05.232: E/AndroidRuntime(5046):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1660)
04-11 11:45:05.232: E/AndroidRuntime(5046):     ... 11 more
04-11 11:45:05.232: E/AndroidRuntime(5046): Caused by: java.lang.IllegalStateException
04-11 11:45:05.232: E/AndroidRuntime(5046):     at android.media.MediaPlayer._reset(Native Method)
04-11 11:45:05.232: E/AndroidRuntime(5046):     at android.media.MediaPlayer.reset(MediaPlayer.java:1112)
04-11 11:45:05.232: E/AndroidRuntime(5046):     at com.android.helloandroid.HelloAndroidActivity.crashMediaPlayer(HelloAndroidActivity.java:421)
04-11 11:45:05.232: E/AndroidRuntime(5046):     ... 14 more
Run Code Online (Sandbox Code Playgroud)

所以现代墨水的猜测是正确的.MediaPlayer.reset()在End状态(在调用release()之后发生)抛出IllegalStateException.

在我的例子中,我发现我在onPause()上调用了release(),但没有在onResume()中再次初始化MediaPlayer.因此,当我调用reset()时,它处于End状态;

根据http://developer.android.com/reference/android/media/MediaPlayer.html,

一旦MediaPlayer对象处于End状态,就无法再使用它,也无法将其恢复到任何其他状态.

这意味着你需要从头再来创建的MediaPlayer,从媒体播放器=新的MediaPlayer()或的mediaPlayer.onCreate()方法中的一种.或者在调用release()时要小心.