我的应用程序活动中有很多Mediaplayer声音,我有按钮停止正在播放的所有声音,但它占用了大量空间,我想知道代码如何同时停止所有mediplayer声音不喜欢这个:
sadegfqc.pause();
dsfsdf.pause();
sadfsadfsad.pause();
dsfg.pause();
htzh.pause();
nensmene.pause();
fdshs.pause();
gshtrhtr.pause();
hfshztjr.pause();
sgawg.pause();
然后我必须再次使用源代码调用Mediaplayer的所有创建。 像这样:
dsfsadf= MediaPlayer.create(this, R.raw.dsfsadf);
答案 0 :(得分:1)
SoundPool是一个更好的替代方案。我强烈反对实例化多个MediaPlayer实例,因为大多数系统没有资源来生成许多并行活动实例。您会在许多设备上发现,按下按钮超过5次会导致基于内存的崩溃。
就停止所有活动流而言,没有用于此的烘焙功能,但它很容易以类似于现有代码的方式完成。作为旁注,有一个autoPause()方法,它停止所有流,但它并没有真正结束它们的播放(因为方法名称暗示)。以下是管理音频流的简单示例:
//SoundPool initialization somewhere
SoundPool pool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
//Load your sound effect into the pool
int soundId = pool.load(...); //There are several versions of this, pick which fits your sound
List<Integer> streams = new ArrayList<Integer>();
Button item1 = (Button)findViewById(R.id.item1);
item1.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
int streamId = pool.play(soundId, 1.0f, 1.0f, 1, 0, 1.0f);
streams.add(streamId);
}
});
Button stop = (Button)findViewById(R.id.stop);
stop.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
for (Integer stream : streams) {
pool.stop(stream);
}
streams.clear();
}
});
管理streamID值列表的内存效率比MediaPlayer实例高得多,您的用户会感谢您。另请注意,即使streamID不再有效,也可以安全地调用SoundPool.stop(),因此您无需检查现有的播放。