Android声音池意外地使应用程序关闭,当播放大量声音时没有消息

时间:2015-05-11 15:18:55

标签: android soundpool

在我的应用程序中,我有一个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太多了吗?..请让我知道我做错了什么。三江源!!

1 个答案:

答案 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);
}