自从上次发了篇博客说从新浪blog转移过来之后,就没什么声了,今天突然想起来,又正好搞定了一个小问题,所以就上来更新一记~


最近准备写一个小Android程序,一边学一边想一边写,感觉在程序启动的时候除了欢迎界面,还需要一小段音乐来助助幸。之前看过SoundPool和MediaPlayer的东西,所以三下五除二就在WelcomeActivity中加入了SoundPool的代码,然后一跑发现根本没有出声。


在DDMS中看了一下,看到一条sample 1 not ready的message。第一感觉是难道是音乐文件有问题?于是又在网上下了段小背景音乐(SoundPool对音乐文件大小上限有要求),一放进去跑还是这条message。没法,看API...翻看了一遍SoundPool相关的API,稍微调整了一些代码,满怀信心地又跑了一次,还还是sample 1 not ready...


然后就问度娘,发现百度知道、soso、eoe上都有人在问这个问题,但是几乎没有一条回答的。在论坛里看了一圈也没发现什么解决方法。

再次看API,发现SoundPool的一个方法:

public void setOnLoadCompleteListener (SoundPool.OnLoadCompleteListener listener)
Since: API Level 8
Sets the callback hook for the OnLoadCompleteListener.

既然报的是sample not ready的问题,那就是说可能是在load音乐片段的时候没有完成,导致在play的时候报not ready,而SoundPool中又有setOnLoadCompleteListener方法用来判断音乐加载是否完成,那可能问题就真的是出在音乐加载这里了,于是就试了下,bingo,搞定~



在搜索解决方法的过程中,看到有些人的代码中有Thread.sleep的代码,所以想既然是音乐加载未完成导致的问题,那给它一段时间来加载是否就能正常了?于是就在初始化SoundPool的过程中,load后面加了100ms的sleep,程序跑了一下,嗯,也能发声~


所以,总结一下关于SoundPool中出现sample not ready类似问题的解决方法:

问题产生的原因:

因为音乐未加载完成,所以导致无法播放。


解决方法:

一、较好的推荐方法:调用setOnLoadCompleteListener方法来确保音乐加载完成。这里需要注意的是SoundPool.OnLoadCompleteListener listener需要实现SoundPool.OnLoadCompleteListener接口。

二、土鳖的简单方法:直接在load后面加一定的sleep,睡好了问题也就解决了:)但是这里sleep的时长是个比较人品的事情,跟加载的文件的多少大小都有关,当然要么试,要么有方法一。


今天就到这里,也算解决了一点小问题,加油加油~