Как остановить все звуки в действии?

У меня много звуков медиаплеера в моем приложении, и у меня есть кнопка для остановки всех воспроизводимых звуков, но она занимает много места, и я хочу знать код, как остановить все звуки медиаплеера одновременно не вот так:

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

person lalilei    schedule 28.04.2015    source источник
comment
используйте саундпул, может поможет   -  person amodkanthe    schedule 28.04.2015
comment
Есть несколько сообщений, которые отвечают на ваш вопрос. Посмотрите: stackoverflow. ком/вопросы/10011515/   -  person VulfCompressor    schedule 28.04.2015
comment
soundpool лучше, но soundpool предназначен только для коротких звуков.   -  person Opiatefuchs    schedule 28.04.2015


Ответы (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, и ваши пользователи будут вам благодарны. Также обратите внимание, что вызов SoundPool.stop() безопасен, даже если идентификатор потока больше недействителен, поэтому вам не нужно проверять существующее воспроизведение.

person King of Masses    schedule 28.04.2015