Android Java - звуки SoundPool перестают воспроизводиться по какой-то причине

Ну, я использую SoundPool для onClick звуков ImageView, и некоторые из них запускают другую активность. Так :

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    switch (v.getId()){
    case R.id.main_menue_status:{
button_click.play(button_clickID, 1,1, 0, 0, 1); //this is SoundPoool's play
    Intent intent=new Intent(context,MainMenueActivity.class);
        startActivity(intent);
        finish();
    }

другие действия имеют те же ImageViews (на самом деле, кнопки) для навигации по приложению. И все время использую finish(); чтобы предотвратить создание миллионов копий деятельности. Таким образом, после примерно 30 прослушиваний SoundPool звук вообще перестает воспроизводиться.

Я предполагаю, что это потому, что я завершаю () действие до того, как звук завершит его воспроизведение, поэтому каким-то образом система вообще перестанет воспроизводить любой SoundPool.

Любой совет?

UPD: Лог:

12-01 19:04:49.797: E/AudioTrack(19981): AudioFlinger could not create track, status: -12
12-01 19:04:49.797: E/SoundPool(19981): Error creating AudioTrack

person Vlad Alexeev    schedule 01.12.2013    source источник
comment
Как и когда вы загружаете свои звуковые ресурсы? Я считаю, что статус: -12 - это ошибка нехватки памяти. Я бы подумал, что либо вы загружаете звуки, которые слишком велики, либо вы нажимаете ограничение устройства на загруженных звуковых дорожках, что технически составляет 32, но обычно меньше.   -  person Mike M.    schedule 01.12.2013
comment
каждый SoundPool имеет максимум 3 воспроизведения (1-й параметр), поэтому я получил 2-3 объекта SoundPool в каждом действии. Когда я выхожу из Activity - я использую finish(), поэтому, как я предполагаю, память должна быть освобождена.   -  person Vlad Alexeev    schedule 02.12.2013
comment
Это может быть не так. finish() не является гарантией того, что действие будет немедленно завершено. Вместо этого я бы попробовал загрузить ваши звуковые ресурсы в onResume() и выгрузить в onPause().   -  person Mike M.    schedule 02.12.2013
comment
Кстати, первый параметр в конструкторе SoundPool — это максимальное количество одновременных потоков, а не максимальное количество загружаемых ресурсов.   -  person Mike M.    schedule 02.12.2013
comment
Я знаю о потоках, просто использовал неправильный термин. как мне их разгрузить?   -  person Vlad Alexeev    schedule 02.12.2013
comment
SoundPool.unLoad(sound_id)   -  person Mike M.    schedule 02.12.2013
comment
вместе с .release() это помогло. Вы можете сделать ответ, и я приму его, если хотите   -  person Vlad Alexeev    schedule 02.12.2013
comment
Превосходно! Извини, я должен был тебя тоже отпустить. Пока вы повторно создаете экземпляр SoundPool в onResume(), это должно быть круто. Спасибо, сделаю ответ. Нужна ТАКАЯ уличная репутация!   -  person Mike M.    schedule 02.12.2013


Ответы (1)


Я считаю, что «статус: -12» - это ошибка нехватки памяти. Кроме того, вызов finish() в действии не является гарантией того, что действие немедленно завершится и освободит ресурсы.

Поскольку у вас есть несколько Activity и несколько SoundPools, я бы рекомендовал создать SoundPool и загрузить ваши звуковые ресурсы в метод Activity onResume(), а затем выгрузить ресурсы и освободить SoundPool в методе onPause().

person Mike M.    schedule 01.12.2013