播放大量声音时,Android soundpool 意外关闭应用程序而没有消息

Posted

技术标签:

【中文标题】播放大量声音时,Android soundpool 意外关闭应用程序而没有消息【英文标题】:Android soundpool unexpectedly making the application close with no message when lots of sounds played 【发布时间】:2015-05-11 15:18:54 【问题描述】:

在我的应用程序中,我有一个 makesound(int) 方法,当我希望在游戏的不同阶段发出声音时会调用该方法。 我已经创建了音频管理器和声音池变量 public 并在 OnCreate 方法中初始化了声音池和音频管理器。

audioManager = (AudioManager) this.getSystemService(this.AUDIO_SERVICE);
soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);

我的 makesound(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);
            
        );
    

当我只播放一个声音时,这很好用。但是在我设置了 switch case stmt 并播放了很多声音之后,我注意到应用程序会运行一段时间,但突然崩溃,没有任何消息或任何东西。我加载 Soundpool 太多了吗?..请让我知道我做错了什么。谢谢!!

【问题讨论】:

【参考方案1】:

你使用错误的方式来实现你的逻辑。

首先你不需要每次都在 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));

现在你已经通过 load 方法返回了 soundIds,使用 then 来播放声音

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);

【讨论】:

以上是关于播放大量声音时,Android soundpool 意外关闭应用程序而没有消息的主要内容,如果未能解决你的问题,请参考以下文章

在android soundpool中播放新声音时如何停止所有其他以前的声音?

为啥我的 SoundPool 声音第一次在 Android 上没有播放?

Android SoundPool 不播放 wav 格式的声音

Android 编程 - 如何从广播接收器播放 SoundPool 声音?

Android 游戏 - SoundPool 没有在 Motorola Droid X2 上播放声音

如何使用 Android 动画播放“滴答滴答”声音(可能使用“Android MediaPlayer / SoundPool”)?