2013-05-24 7 views
4

Я использую AVAudioPlayer для воспроизведения звука, когда пользователь вводит строку в UITableView. Если они снова нажимают на строку, игрок останавливается и устраивается, и если они прослушивают песню до ее завершения, то обработчик FinshedPlaying распоряжается игроком.Как вы удаляете AVAudioPlayer при вызове события FinishedPlaying?

Проблема у меня в том, что, когда я пытаюсь избавиться от игрока в обработчике FinishedPlaying я получаю сообщение об ошибке:

System.ObjectDisposedException: объект был игрок Dispose() d во время обратный вызов, это испортило состояние программы

Вот код, любая идея, что я делаю неправильно?

void HandleOnRequestPlayMusic (object sender, UrlEventArgs e) 
{ 
    var url = Utils.UrlFromString(e.Url); 
    string oldUrl = ""; 
    if (musicPlayer != null) 
    { 
     oldUrl = musicPlayer.Url.AbsoluteString; 
     KillAudioPlayer(); // no problems killing the audio player from here 
    } 
    if (oldUrl != url.AbsoluteString) 
    { 
     musicPlayer = AVAudioPlayer.FromUrl(url); 
     musicPlayer.FinishedPlaying += HandleAudioFinished; 
     musicPlayer.Play(); 
    } 
} 

void HandleAudioFinished (object sender, AVStatusEventArgs e) 
{ 
    KillAudioPlayer(); // killing audio player from here causes app to crash 
} 

void KillAudioPlayer() 
{ 
    if (musicPlayer != null) 
    { 
     InvokeOnMainThread(() => { 
      musicPlayer.Stop(); 
      musicPlayer.FinishedPlaying -= HandleAudioFinished; 
      musicPlayer.Dispose(); 
      musicPlayer = null; 
     }); 
    } 
} 

ответ

4

Не используйте InvokeOnMainThread там, потому что InvokeOnMainThread ожидает ввода действия, которое будет завершено, прежде чем вернуться к своему абоненту. Вот почему ваш вызов Dispose происходит, пока вы все еще находитесь внутри вызова до KillAudioPlayer, внутри обратного вызова HandleAudioFinished.

Вместо этого используйте BeginInvokeOnMainThread, который запланирует, что ваше действие по очистке произойдет в основном потоке, но немедленно вернется к вашей функции KillAudioPlayer, что позволит завершить ее.

Смежные вопросы