Android — сделать SoundPool глобальным классом? (Доступно для всех остальных классов)

В общем, я создаю игру на SurfaceView, и у меня есть эти классы в моем основном CustomView:

private TitleScreen titleScreen;
private GameScreen gameScreen;
private PauseScreen pauseScreen;
private GameOverScreen gameOverScreen;

Каждый из этих классов имеет метод draw(Canvas canvas) и вызывается, когда пользователь переходит на другой экран. Но дело в том, что у меня есть класс SoundPlayer, который включает все мои звуковые эффекты с использованием SoundPool. Он будет использоваться во всех этих классах. Есть ли способ, которым SoundPlayer загружается только один раз, а затем доступен во всех этих классах? Или мне нужно вызывать release() и вызывать конструктор каждый раз, когда я переключаюсь? Заранее спасибо. :D

ОБНОВЛЕНИЕ (РЕШЕНО):

Итак, вот что я сделал. Я создал экземпляр своего класса SoundPlayer:

public class SoundPlayerInstance {
private static SoundPlayer soundPlayerInstance;
private SoundPlayerInstance(){}

public static void createInstance(Context context){
soundPlayerInstance = new SoundPlayer(context);
}

public static SoundPlayer getInstance(){
return soundPlayerInstance;
}
}

В моем основном представлении, прежде чем что-либо делать, я вызываю это в своем конструкторе:

SoundPlayerInstance.createInstance();

Затем в любом из моих классов я могу просто вызвать его для воспроизведения звука:

SoundPlayerInstance.getInstance().playSound();

Я думаю, что это будет полезно не только для подобных ситуаций, но также может быть полезно для разработчиков (таких как я), которые хотят создать экземпляр класса, доступного во всех других классах. Спасибо system32 за ответ на мой вопрос. :)


person dabaerju    schedule 13.02.2013    source источник


Ответы (1)


Есть ли способ, которым SoundPlayer загружается только один раз, а затем доступен во всех этих классах?

Возможно. Сделайте SoundPlayer класс singleton.

public class SoundPlayer
{

  private static SoundPlayer instance;

  private SoundPlayer()
  {
     // Do some stuff
  }

  public static SoundPlayer getInstance()
  {
     if(instance == null)
         instance = new SoundPlayer();

     return instance;
  }

}

Чтобы получить глобальный доступ, просто позвоните SoundPlayer.getInstance()

person Glenn    schedule 13.02.2013
comment
Создать этот класс в моем основном CustomView? Я попробую это и посмотрю, работает ли это. Спасибо. :) - person dabaerju; 13.02.2013
comment
У тебя SoundPlayer класс, верно? просто измените его. Это хороший способ загрузить ресурсы/объекты один раз :) - person Glenn; 13.02.2013
comment
Это полностью работает сейчас. Я просто немного отредактировал ваш код. благодаря. :D - person dabaerju; 13.02.2013
comment
Но какой контекст вы можете использовать для загрузки звуков в хэш-карту синглтона? Использование этого без передачи контекста дает мне ошибку, связанную с проблемами, связанными с включением класса. Создание синглтона путем передачи контекста дает мне проблему, когда моя игра удаляется, звуковой пул выгружается и я возвращаюсь, потому что действие, к которому я возвращаюсь, не загружает синглтон. Единственное, о чем я мог подумать, это попытаться перезапустить (и перезагрузить звуки) синглтон при каждом запуске... возможно, с помощью getBaseContext(). - person MacD; 27.03.2013
comment
@MacD Используйте getApplicationContext(), это одноэлементный контекст - person Glenn; 27.03.2013
comment
Спасибо... это именно то, что я сделал :) Хотя было отстойно добавлять эту инициализацию к каждому действию onResume! - person MacD; 03.04.2013