Класс AudioPlayer довольно уникален. Он живет только в течение небольшого периода времени. В приложении, которое использует BackgroundAudioPlayer, ваша реализация класса AudioPlayer останется в живых только для выполнения задачи по изменению состояния воспроизведения. Поэтому, когда пользователь начинает что-то воспроизводить, создается экземпляр вашего класса AudioPlayer, чтобы выполнить задачу начала воспроизведения. Как только вы вызываете NotifyComplete () в OnUserAction или OnPlayStateChanged, экземпляр вашего AudioPlayer исчезает.
Фоновый поток, с которым связан AudioPlayer, все еще будет активным, и в этом потоке могут быть живы другие объекты, но AudioPlayer будет прерван. Созданный по умолчанию AudioPlayer намекает на это с помощью поля _classInitialized. Это статично, потому что AudioPlayer будет создаваться много раз, но мы хотим подключиться к этому событию только один раз.
Я бы предложил одну из двух вещей. Первый - получить ответ json только тогда, когда вам нужно перейти к следующей песне. Вы не будете вызывать NotifyComplete () до тех пор, пока не вернется ответ.
Вот некоторый псевдокод:
override OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param)
{
GetJsonResponse();
}
private void GetJsonResponce()
{
// async call to your service
// When async completes:
track.BeginEdit();
track.Title = (string) jObject["title"];
track.Artist = (string) jObject["artist"];
track.Album = (string) jObject["album"];
track.EndEdit();
NotifyComplete();
}
Второй - иметь класс, который делает это в фоновом режиме. Этот класс будет иметь статическое свойство для получения экземпляра, который является живым в потоке. Тогда ваш AudioPlayer получит необходимую информацию от этого объекта
public class Songs
{
static Songs _instance;
public static Songs Instance
{
get { return _instance ?? new Songs(); }
}
// Do you timer stuff here
// Allow the ability to access the timer stuff also.
}
// in AudioPlayer
override OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param)
{
Songs.Instance.GetStuff
NotifyComplete();
}