实习入职第九天:Attempt to call getDuration without a valid mediaplayer

这种问题,最残忍了,


他的错误一般发生在设置 :MediaPlayer的播放进度条里面,而发生这种错误的原因是这样的:


attempt to callgetDuration without a valid mediaplayer

error (-38, 0)

查了好长时间,引起这个异常的原因有几个:

一是如果mediaPlayer对象为null,那么在执行这个方法的时候会报异常

二是在mediaPlayer对象为不可用状态的时候也会报这个错

为此,我查了一下书,顺便学习了一下MediaPlayer的生命周期,书中是这样解释的:

1)  当一个MediaPlayer对象被新建或调用reset()方法之后,它处于空闲状态,在调用release方法之后,才会处于结束状态。

2)  一个新建的MediaPlayer对象在调用getCurrenProgress()、getDuration、getVideoHeight()、getVideoWith()、setAudioStreamType(int)、setLooping(boolean)、setVolume(float,float)、pause()、start()、stop()、seekTo()、prepare()、prepareAsync()方法时,不会触发OnErrorListenerError()事件,但是MediaPlayer对象如果调用了reset()方法后,再使用这些方法则会触发OnErrorListenerError()事件。

所以,当你调用了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变量,只有为真的时候才回去做这件事


就解决了这种问题,


但是他的缺点也是:不一定保证任何时候他们都  成功,因为有可能还是会错开,这个时候还是会发生异常,虽然这种概率很低,


然后可以休息几秒再次判断比较,三层,无论你加多少层,还是无法避免:这种可能出现的情况

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值