错误log:
1566550586.419 28478-28478/com.stone.stonemusic W/System.err: java.lang.IllegalStateException
1566550586.420 28478-28478/com.stone.stonemusic W/System.err: at android.media.MediaPlayer._prepare(Native Method)
1566550586.420 28478-28478/com.stone.stonemusic W/System.err: at android.media.MediaPlayer.prepare(MediaPlayer.java:1236)
1566550586.421 28478-28478/com.stone.stonemusic W/System.err: at com.stone.stonemusic.utils.playControl.MediaUtils.prepare(MediaUtils.java:43)
1566550586.421 28478-28478/com.stone.stonemusic W/System.err: at com.stone.stonemusic.utils.playControl.PlayControl.controlBtnLast(PlayControl.java:122)
1566550586.422 28478-28478/com.stone.stonemusic W/System.err: at com.stone.stonemusic.ui.activity.PlayActivity.onClick(PlayActivity.java:223)
1566550586.422 28478-28478/com.stone.stonemusic W/System.err: at android.view.View.performClick(View.java:5647)
1566550586.422 28478-28478/com.stone.stonemusic W/System.err: at android.view.View
P
e
r
f
o
r
m
C
l
i
c
k
.
r
u
n
(
V
i
e
w
.
j
a
v
a
:
22465
)
1566550586.42228478
−
28478
/
c
o
m
.
s
t
o
n
e
.
s
t
o
n
e
m
u
s
i
c
W
/
S
y
s
t
e
m
.
e
r
r
:
a
t
a
n
d
r
o
i
d
.
o
s
.
H
a
n
d
l
e
r
.
h
a
n
d
l
e
C
a
l
l
b
a
c
k
(
H
a
n
d
l
e
r
.
j
a
v
a
:
754
)
1566550586.42328478
−
28478
/
c
o
m
.
s
t
o
n
e
.
s
t
o
n
e
m
u
s
i
c
W
/
S
y
s
t
e
m
.
e
r
r
:
a
t
a
n
d
r
o
i
d
.
o
s
.
H
a
n
d
l
e
r
.
d
i
s
p
a
t
c
h
M
e
s
s
a
g
e
(
H
a
n
d
l
e
r
.
j
a
v
a
:
95
)
1566550586.42328478
−
28478
/
c
o
m
.
s
t
o
n
e
.
s
t
o
n
e
m
u
s
i
c
W
/
S
y
s
t
e
m
.
e
r
r
:
a
t
a
n
d
r
o
i
d
.
o
s
.
L
o
o
p
e
r
.
l
o
o
p
(
L
o
o
p
e
r
.
j
a
v
a
:
163
)
1566550586.42328478
−
28478
/
c
o
m
.
s
t
o
n
e
.
s
t
o
n
e
m
u
s
i
c
W
/
S
y
s
t
e
m
.
e
r
r
:
a
t
a
n
d
r
o
i
d
.
a
p
p
.
A
c
t
i
v
i
t
y
T
h
r
e
a
d
.
m
a
i
n
(
A
c
t
i
v
i
t
y
T
h
r
e
a
d
.
j
a
v
a
:
6393
)
1566550586.42328478
−
28478
/
c
o
m
.
s
t
o
n
e
.
s
t
o
n
e
m
u
s
i
c
W
/
S
y
s
t
e
m
.
e
r
r
:
a
t
j
a
v
a
.
l
a
n
g
.
r
e
f
l
e
c
t
.
M
e
t
h
o
d
.
i
n
v
o
k
e
(
N
a
t
i
v
e
M
e
t
h
o
d
)
1566550586.42428478
−
28478
/
c
o
m
.
s
t
o
n
e
.
s
t
o
n
e
m
u
s
i
c
W
/
S
y
s
t
e
m
.
e
r
r
:
a
t
c
o
m
.
a
n
d
r
o
i
d
.
i
n
t
e
r
n
a
l
.
o
s
.
Z
y
g
o
t
e
I
n
i
t
PerformClick.run(View.java:22465) 1566550586.422 28478-28478/com.stone.stonemusic W/System.err: at android.os.Handler.handleCallback(Handler.java:754) 1566550586.423 28478-28478/com.stone.stonemusic W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95) 1566550586.423 28478-28478/com.stone.stonemusic W/System.err: at android.os.Looper.loop(Looper.java:163) 1566550586.423 28478-28478/com.stone.stonemusic W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6393) 1566550586.423 28478-28478/com.stone.stonemusic W/System.err: at java.lang.reflect.Method.invoke(Native Method) 1566550586.424 28478-28478/com.stone.stonemusic W/System.err: at com.android.internal.os.ZygoteInit
PerformClick.run(View.java:22465)1566550586.42228478−28478/com.stone.stonemusicW/System.err:atandroid.os.Handler.handleCallback(Handler.java:754)1566550586.42328478−28478/com.stone.stonemusicW/System.err:atandroid.os.Handler.dispatchMessage(Handler.java:95)1566550586.42328478−28478/com.stone.stonemusicW/System.err:atandroid.os.Looper.loop(Looper.java:163)1566550586.42328478−28478/com.stone.stonemusicW/System.err:atandroid.app.ActivityThread.main(ActivityThread.java:6393)1566550586.42328478−28478/com.stone.stonemusicW/System.err:atjava.lang.reflect.Method.invoke(NativeMethod)1566550586.42428478−28478/com.stone.stonemusicW/System.err:atcom.android.internal.os.ZygoteInitMethodAndArgsCaller.run(ZygoteInit.java:933)
1566550586.424 28478-28478/com.stone.stonemusic W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
原因:
这是我的源码
public static void prepare(String path) {
if (getMediaPlayer() != null) {
try {
getMediaPlayer().reset();
getMediaPlayer().setDataSource(path);
getMediaPlayer().prepare();
}catch (Exception e) {
e.printStackTrace();
}
}
}
public static void start() {
if (getMediaPlayer() != null) {
getMediaPlayer().start();
MediaUtils.currentState = MediaStateCode.PLAY_START;
}
}
其实这样写是没有问题的,在调用本地音乐的时候,在调用网络歌曲的时候,高概率会出现上面报的java.lang.IllegalStateException异常。
出现这个异常的原因是调用方法的时机或者状态不对。然后我查阅了MediaPlay的生命周期流程图。下面附图。
参考一篇文章之后,发现是在reset()之后调用MediaPlayer对象的getDuration()方法引起的,所以我就不调用getDuration()方法,就解决了。
解释如下:
Idle 状态:当使用new()方法创建一个MediaPlayer对象或者调用了其reset()方法时,该MediaPlayer对象处于idle状态。这两种方法的一个重要差别就是:如果在这个状态下调用了getDuration()等方法(相当于调用时机不正确),通过reset()方法进入idle状态的话会触发OnErrorListener.onError(),并且MediaPlayer会进入Error状态;如果是新创建的MediaPlayer对象,则并不会触发onError(),也不会进入Error状态。
参考链接:https://blog.csdn.net/ddna/article/details/5178864
所以在出现MediaPlay有问题的情况下,还是看看他的状态和生命周期流程图比较好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)