android SoundPool调用stop方法使用注意问题

在项目中需要播放很短而不一样的铃声,在网上找了很多资料,对于比较小的铃声都推荐是使用SoundPool来实现,因为SoundPool有以下优点:

1. SoundPool最大只能申请1M的内存空间,这就意味着我们只能用一些很短的声音片段,而不是用它来播放歌曲或者做游戏背景音乐。
2. SoundPool提供了pause和stop方法,但这些方法建议最好不要轻易使用,因为有些时候它们可能会使你的程序莫名其妙的终止。Android开发网建议使用这两个方法的时候尽可能多做测试工作,还有些朋友反映它们不会立即中止播放声音,而是把缓冲区里的数据播放完才会停下来,也许会多播放一秒钟。
3. SoundPool的效率问题。其实SoundPool的效率在这些播放类中算是很好的了,但是有的朋友在G1中测试它还是有100ms左右的延迟,这可能会影响用户体验。也许这不能管SoundPool本身,因为到了性能比较好的Droid中这个延迟就可以让人接受了。

初始化SoundPool:

mSP = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
mSPMap = new HashMap<Integer, Integer>();
mSPMap.put(1, mSP.load(this, R.raw.buzz4, 1));
mSPMap.put(2, mSP.load(this, R.raw.alarm1, 1));
mAudio = (AudioManager)this.getSystemService(Context.AUDIO_SERVICE);
播放:

private void playSound(int pSound, int pNumber){
	mCurrentVolume = AntiLostDataSource.getAlarmVolume(this);
	if(mCurrentVolume == 0){
		mCurrentVolume = mAudio.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
		AntiLostDataSource.setAlarmVolume(this, mCurrentVolume);
	}
	mSP.play(mSPMap.get(pSound), mCurrentVolume, mCurrentVolume, 1, pNumber, 1);
}

停止:

private void stopSound(){
	mSP.stop(2);
}
因为我每次停止的流对应的ID是2,所以我就这么写了,点击播放然后点击停止,都没有问题,但第二次点击播放然后点击停止后,一直在播放,不能停止,找了很长时间看是否是其他变量导致的没有执行这个stop方法,但通过log发现这句代码执行了,我也不知道为啥,找了很久最后看了下doc的stop方法,原来这个流对应的ID是需要play方法返回的,后来我用mPresentPlayId存储play返回的流ID,在stop时将流ID使用mPresentPlayId来替换就没问题了,后来输出了下mPresentPlayId的值,发现这个值第一次是2.第二次是4,以后使用这个方法一定要注意这个问题。


你可能感兴趣的:(android,测试,service,Integer,存储,音乐)