Почему происходит сбой MediaPlayer? - PullRequest
0 голосов
/ 12 сентября 2011

Вот ошибка:

09-12 22:13:05.253: ERROR/AudioFlinger(561): not enough memory for AudioTrack size=53560
09-12 22:13:05.253: ERROR/AudioTrack(561): AudioFlinger could not create track, status: -12
09-12 22:13:05.253: ERROR/AudioSink(561): Unable to create audio track
09-12 22:13:05.253: ERROR/audiothread(561): Error creating AudioTrack
09-12 22:13:05.253: ERROR/PlayerDriver(561): Command PLAYER_PREPARE completed with an error or info PVMFFailure
09-12 22:13:05.253: ERROR/MediaPlayer(2368): error (1, -1)

То, что я делаю, - это создание объекта SoundFX внутри базового действия (все другие действия расширяют базу - так, что все они имеют общие звуковые эффекты и подменю),

Вот мой класс SoundFX:

public class SoundFX {
private SharedPreferences prefs = null;
private MediaPlayer[] sounds = null;

SoundFX(Context c){
    ValidateObject.isNotNull(c, "Null context.");

    prefs = PreferenceManager.getDefaultSharedPreferences(c);
    ValidateObject.isNotNull(prefs, "Null preferences.");

    sounds = new MediaPlayer[4];
    sounds[0] = MediaPlayer.create(c, R.raw.snd_button_menu);
    sounds[1] = MediaPlayer.create(c, R.raw.snd_button_direction);
    sounds[2] = MediaPlayer.create(c, R.raw.snd_button_text);
    sounds[3] = MediaPlayer.create(c, R.raw.snd_button_drill);
}

public void menu(){
    if (prefs.getBoolean("SoundFX", true)){
        sounds[0].start();
    }
}

public void direction(){
    if (prefs.getBoolean("SoundFX", true)){
        sounds[1].start();
    }
}

public void text(){
    if (prefs.getBoolean("SoundFX", true)){
        sounds[2].start();
    }
}
public void drill(){
    if (prefs.getBoolean("SoundFX", true)){
        sounds[3].start();
    }
}
}

Это будет моя "базовая" деятельность, которая распространяется на все действия:

public class ActivityWithMenu extends Activity {
protected SoundFX soundEffects = null;

@Override
public void onCreate(Bundle savedInstanceState){
     super.onCreate(savedInstanceState);
     // no content view...
     soundEffects = new SoundFX(this);
     ValidateObject.isNotNull(soundEffects, "Null SoundFX Object.");
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.submenu, menu);
    return true;
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.submenu_hide:
        moveTaskToBack(true);
        return true;
    case R.id.submenu_help:
        startActivity(new Intent(this, HelpActivity.class));
        return true;
    case R.id.submenu_preferences:
        startActivity(new Intent(this, Preferences.class));
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

}

Создает ли каждое действие новый экземпляр итаким образом выделяя больше памяти?Кажется, я не могу понять, почему у меня закончилась память.У меня сложилось впечатление, что все дочерние действия будут использовать один и тот же объект SoundFX ...

edit:

Ошибка возникает после создания и уничтожения примерно 10 ~ 12 действий.Это хорошо работает до того.

1 Ответ

1 голос
/ 12 сентября 2011

Вам необходимо release() медиаплееры, прежде чем уничтожать класс (вероятно, в onDestroy вашей активности), в противном случае ресурсы не будут освобождены (дух), и вы скоро выйдете из памяти (так как вы распределите их снова в следующем время).

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

...