如何正确释放 SoundPool 对象?

Posted

技术标签:

【中文标题】如何正确释放 SoundPool 对象?【英文标题】:How to properly release SoundPool objects? 【发布时间】:2016-04-11 00:57:36 【问题描述】:

以下代码播放随机声音。我正在尝试释放它,因为我不再需要该按钮来播放其他任何内容,但是当我运行应用程序时,该按钮根本不会播放任何声音。

public class actibida extends AppCompatActivity 
SoundPool soundPool;
Button button;
boolean loaded = false;

protected void onCreate(Bundle savedInstanceState) 

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_actibida);

    soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
    soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() 
        @Override
        public void onLoadComplete(SoundPool soundPool, int sampleId, int status) 
            loaded = true;
        
    );

    //I have a total of four sounds
    final int[] sound = new int[4];
    sound[0] = soundPool.load(actibida.this, R.raw.el, 1);
    sound[1] = soundPool.load(actibida.this, R.raw.guau, 1);
    sound[2] = soundPool.load(actibida.this, R.raw.miau, 1);
    sound[3] = soundPool.load(actibida.this, R.raw.quack, 1);

    final Random r = new Random();

    button = (Button) this.findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() 

        public void onClick(View button) 

            final Random r = new Random();
            int Low = 0;
            int High = 3;
            int rndm = r.nextInt(High - Low) + Low;
            soundPool.play(sound[r.nextInt(4)], 1.0f, 1.0f, 0, 0, 1.0f);


        

    );
    soundPool.release();
        

有人可以教我如何正确调用 .release() 吗?

附:如果我要在应用程序中播放其他声音,我应该使用不同的 SoundPool 类吗?还是我应该释放它并再次加载它?问题是我什至无法释放,所以我不能说。

【问题讨论】:

【参考方案1】:

您在声音播放完毕之前释放 SoundPool。事实上,您在播放开始的那一刻就释放了它。 play() 方法不等待声音完成 - 播放是异步的。此外,无法确定播放何时结束。

如果您将来要从同一个声音池中播放,您可以简单地将 SoundPool 设置为某种单例或将其存储在某个可以重复使用的地方。

【讨论】:

我编辑了帖子,以便任何人都可以检查其余代码。我尝试放置 soundPool.release();最后,但它仍然不起作用。我应该放置它吗? 如果活动结束后你不打算使用它,那么在 onDestroy() 中释放。

以上是关于如何正确释放 SoundPool 对象?的主要内容,如果未能解决你的问题,请参考以下文章

单击按钮时如何发出随机声音?

SoundPool 减慢应用程序

如何释放我的 soundPool 媒体?

SoundPool 停止功能未停止

android : 使用 SoundPool 播放具有短演变周期的短声音

Sound Pool 只播放一次声音