Я использую 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;
});
}
}