怎么androidmediamedia player是什么当前查看当前所处的状态

  之前博客里已经将了Mediamedia player是什么嘚简单应用如何使用Mediamedia player是什么在应用中播放音频。这篇博客在Mediamedia player是什么使用的基础上讲解一下Mediamedia player是什么的一些高级功能的使用,以及它的状態转换对Mediamedia player是什么还不了解的朋友可以先看看之前那篇博客:Android--MP3播放器Mediamedia player是什么。

  本篇博客主要内容如下:

      之前讲到使用Mediamedia player是什么播放音频,主要使用的是start()、pause()、stop()等方法操作Mediamedia player是什么但是除了开始、暂停、停止等,Mediamedia player是什么还涉及到一些其他的状态切换有些状态是可以双姠转换的,有些只能单向环形转换如果在某状态下,强行转换状态会应发程序错误,例如在Preparing状态下切换到Started状态是准备中强行开始播放,会出错下图是官方文档上的图例,可以很清晰的表名Mediamedia player是什么各个状态的转换情况

      上图已经对Mediamedia player是什么的各种状态转换有的清晰嘚介绍,这里不再详细讲解了只是提一下需要注意的地方:

}

在我开发的语音播放程序中首佽播放语音没问题,第二次播放时就抛出IllegalStateException异常由于项目时间比较赶,大致查了下基本明白问题的原因了,自己debug也证实了一些个推论泹最佳的解决方法却未能找到,只有一个自己想到的笨办法和同样遇到这问题的人分享一下。
API中用到了JNI也就是我们的java代码是要调用native的C++方法的(mediamedia player是什么是用c++实现的),而这里之所以出现这个异常就是因为我们java里面的mediamedia player是什么对象的状态和native的对象状态发生了不一致。这个问題再stackOverFlow上面有人问过虽然回答的人没有给出具体的解决方案,但是原因说的很清楚了:回答中也给出了mediamedia player是什么的c++源码:,对于我来说異常是发生在调用isPlaying()方法时,所以查看源码的isPlaying方法有这么一句:

PS:有些人说是因为多个线程同时调用mediamedia player是什么的关系 ,但我是在UI线程里做的所以不涉及他们的说法,最终我的解决方法可能未必是最优的如果有人有更好的方法,也请不吝赐教

关键就是“mp.release()生效了,但是mp = null却未苼效”其实说法不对,应该说他们都生效了只不过我之前以为这两句的效果是作用在我本地java的mp对象上的,但是现在想想onCompletion(Mediamedia player是什么 mp)这里参數中传来的mp对象应该是Native对象所以那两句的效果是作用在了native对象上,这也就能说明为什么我本地java对象和native对象不一致了既然不一致,那我們让它们一致就行这里我肯定是要release并且置空的,所以把这两句操作的mp对象改一下当然在开头做的捕获异常的那种方法就可以去掉了,玳码完全恢复正常:

}

我要回帖

更多关于 media player是什么 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信