这种问题,最残忍了,
他的错误一般发生在设置 :MediaPlayer的播放进度条里面,而发生这种错误的原因是这样的:
attempt to callgetDuration without a valid mediaplayer
error (-38, 0)
查了好长时间,引起这个异常的原因有几个:
一是如果mediaPlayer对象为null,那么在执行这个方法的时候会报异常
二是在mediaPlayer对象为不可用状态的时候也会报这个错
为此,我查了一下书,顺便学习了一下MediaPlayer的生命周期,书中是这样解释的:
1)
2)
所以,当你调用了reset()方法后,又调用getDuration()时,就会报异常。
1如果你重置了mediaPlayer,或者释放了,或者mediaPlayer为null,
2但是你再run方法里面引用了这个变量,而且显示进度条的时候,一般都是定时任务,它会post这个run,
3这种情况下:如果你的mediaPlayer发生了 1种描述的各种情况,那么就会从handler里面抛出异常,而且这个异常还不好捕捉,
4.最开始想的是把handler里面的run方法stop掉,调用removeCallBack(runnable),但是试过了没有用,为什么呢,我觉得是线程同步的问题,时间没有搞好,run和stop错开了,不是原子操作,那怎么办,我使用的方法是 :单利模式中有个双重判定的做法,能够避免这种情况,
5.解决办法就是在run方法里面加双层判定flag变量,只有为真的时候才回去做这件事
就解决了这种问题,
但是他的缺点也是:不一定保证任何时候他们都 成功,因为有可能还是会错开,这个时候还是会发生异常,虽然这种概率很低,
然后可以休息几秒再次判断比较,三层,无论你加多少层,还是无法避免:这种可能出现的情况