在我的应用程序中,我有一个makeound(int)方法,当我希望在游戏的不同阶段制作声音时调用它。 我已经创建了audiomanager和soundpool变量public,并在OnCreate方法中初始化了声音池和音频管理器。
audioManager = (AudioManager) this.getSystemService(this.AUDIO_SERVICE);
soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
我的makeound(int)方法在
之下 private void makeSound(int w){
if(onVolume) { //onvolume is a public boolean var that is set
final int volume = audioManager.getStreamVolume(AudioManager.STREAM_SYSTEM);
int id;
switch(w){
case 1:
id = soundPool.load(this, R.raw.metalimpact, 1);
break;
case 2:
id = soundPool.load(this, R.raw.swoosh, 1);
break;
case 3:
id = soundPool.load(this, R.raw.win, 1);
case 4:
id = soundPool.load(this, R.raw.win, 1);//second chance
break;
case 5:
id = soundPool.load(this, R.raw.fanfare, 1);//second chance
break;
default:id = soundPool.load(this, R.raw.metalimpact, 1);
}
final int soundID = id;
soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
public void onLoadComplete(SoundPool soundPool, int sampleId,
int status) {
soundPool.play(soundID, volume, volume, 0, 0, 1f);
}
});
}
}
当我只有一个声音播放时,这工作正常。但是在我设置了开关盒stmt并播放了很多声音之后,我注意到应用程序可以运行一段时间,但突然崩溃,没有任何消息或任何东西。我加载Soundpool太多了吗?..请让我知道我做错了什么。三江源!!
答案 0 :(得分:0)
您使用错误的方式来实现您的逻辑。
首先每次在makeSound(int w)方法中都不需要加载声音。而是首先加载所有声音,然后管理它们是否在LoadCompleteListener中加载。
HashMap<Integer, Integer >loadedSound=new Map<>();
loadedSound.put(1,soundPool.load(this, R.raw.metalimpact, 1));
loadedSound.put(2,soundPool.load(this, R.raw.swoosh, 1));
loadedSound.put(3,soundPool.load(this, R.raw.win, 1));
loadedSound.put(4,soundPool.load(this, R.raw.win, 1));
loadedSound.put(5,soundPool.load(this, R.raw.fanfare,1));
现在你有soundIds通过加载方法返回,然后使用然后播放声音
switch(w)
{
case w: soundPool.play(loadedSound.get(w), volume, volume, 0, 0, 1f);
break;
default:soundPool.play(loadedSound.get(1), volume, volume, 0, 0, 1f);
}