前言
播放媒体测试时,出现Mediaplayer报异常问题,如下打印日志
MediaPlayerNative(13594): start called in state 4, mPlayer(0x75b4e81280) MediaPlayerNative(13594): error (-38, 0) MediaPlayer(13594): Error (-38,0)
记录于此,以便查阅。
总结
原因 :Mediaplayer没有准备好(preparing状态)就开始调用start()方法了。
总结一下:
- 不使用prepareAsync()方法
//mMediaPlayer.prepareAsync(); mMediaPlayer.prepare(); mMediaPlayer.start();
- 监听onPrepared(MediaPlayer iMediaPlayer)回调时start()
- prepare()会阻塞直到获取到数据,prepareAsync()异步,不会阻塞到数据全部获取成功。
个人还是推荐当onPrepared()回调后开始播放,这个表示有数据已经准备好了。
正文
网上也有分析这个问题,这里就简单的附上自己的观点。
使用prepareAsync():
mMediaPlayer.reset(); mMediaPlayer.setDataSource(path); mMediaPlayer.prepareAsync(); mMediaPlayer.start();
按照这个代码片段执行,一定会出现异常,日志如[前言]所示。
使用prepare():
mMediaPlayer.reset(); mMediaPlayer.setDataSource(path); mMediaPlayer.prepare(); mMediaPlayer.start();
prepare()会阻塞到数据完全加载,也就是准备好了,不会出现异常。
但是,上面执行的代码只理想状态,按顺序执行,但是现实测试中,当执行到prepare()时用户是还可以死劲操作的(你懂的 哈哈_)。
所以,需要考虑加锁和onPrepared()回调了执行播放才是最完美的。
什么时候用prepare()和调用prepareAsync()
下面是源码中注释的区别(机器翻译)
- 对于流,调用prepareAsync(),它会立即返回,而不是阻塞直到有足够的数据缓冲。
- 对于文件,调用prepare(),它会阻塞直到MediaPlayer准备好播放。
参考文章
历史上的今天
暂无评论...
随机推荐
[小知识]内存泄漏整理
什么是内存泄漏?总的来说:内存不在GC掌握之内。当一个对象已经不在使用了,本该回收时,而另外一个正在使用的对象持有它的引用而导致内存不能被回收。本该回收的对象没有被回收,而一直停留在堆内存中,这就产生了内存泄漏。Java的GC内存回收机制当对象不再有任何的引用时候才会进行回收。内存分配的...
Android (/sys/路径)属性文件节点值的读写
Android (/sys/路径)属性文件节点值的读写,在朋友代码基础上增加了finally 代码。如下,大致如此 /** * 文件的读取权限记得添加咯 */ /** * 某个节点写入值 * * @param value...
洛夫:石榴树
假若把你的诺言刻在石榴树上枝桠上悬垂着的就显得更沉重了 我仰卧在树下,星子仰卧在叶丛中每一株树属于我,我在每一株树中它们存在,爱便不会把我遗弃 哦!石榴已成熟,这动人的炸裂每一颗都闪烁着光,闪烁着你的名字
Android的apk组成结构
前言总所周知,APK是Android PacKage的缩写,即Android安装包。APK文件其实就是ZIP的压缩格式,如果把APK改成ZIP可以通过压缩软件进行解析。(目前部分压缩软件可以直接解压APK)本文参考网上文章,进行整理。好记性不如烂笔头正文我们解压APK后的组成部分如下(大...
余光中:乡愁
小时候,乡愁是一枚小小的邮票,我在这头,母亲在那头。 长大后,乡愁是一张窄窄的船票,我在这头,新娘在那头。 后来啊,乡愁是一方矮矮的坟墓,我在外头,母亲在里头。 而现在,乡愁是一湾浅浅的海峡,我在这头,大陆在那头。
Android系统切换语言后,Activity中的文本没有改变
前言切换语言后,项目中的APP中的文本没有根据系统的语言改变而改变。这个是个小问题,但还是记录一下,方便自己查阅。正文隐藏内容!付费阅读后才能查看!¥1 ¥3多个隐藏块只需支付一次付费阅读参考文章《[摘]切换多国语言导致Fragment被回收,出现切换错乱》