android SoundPool调用stop方法使用注意问题
2012-03-09 18:03
603 查看
在项目中需要播放很短而不一样的铃声,在网上找了很多资料,对于比较小的铃声都推荐是使用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,以后使用这个方法一定要注意这个问题。
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 SoundPool调用stop方法使用注意问题
- android SoundPool调用pause stop方法使用注意问题
- android SoundPool调用pause stop方法使用注意问题
- android mediaplay的使用中,stop和start的调用问题
- Android 使用MediaRecorder录音调用stop()方法的时候报错
- Android 使用MediaRecorder录音调用stop()方法的时候报错
- Lua脚本接入Android使用JNI调用本地接口,需要注意的问题
- 【android】在Service的onStartCommand()中调用stopself()应该注意的问题
- android js互相调用的方法,混淆后js无效,addJavascriptInterface使用注意事项
- Android 使用MediaRecorder录音调用stop()方法的时候报错【转】
- 【android】在Service的onStartCommand()中调用stopself()应该注意的问题
- 使用main方法调用http请求本地服务器的某个servlet报错问题
- Android开发中,使用线程应该注意的问题!
- java基础问题---java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用
- Android高手进阶教程(十九)之---Android开发中,使用线程应该注意的问题!
- 使用String.split方法时要注意的问题
- android TextView多行文本(超过3行)使用ellipsize属性无效问题的解决方法
- Android 使用android-support-multidex解决Dex超出方法数的限制问题,让你的应用不再爆棚
- android和JS交互,相互调用方法传值。不使用第三方实现原生加载word、ppt、pdf文档