2012-05-06 2 views
0

Я создаю приложение, которое воспроизводит бесконечный поток аудио. Существует отдельная веб-служба, которую я могу запросить, чтобы получить название и исполнитель текущей воспроизводимой дорожки. То, что я хочу сделать, это запросить эту услугу каждые 20 секунд, а затем соответствующим образом установить название трека/исполнителя. В настоящее время я использую фоновый AudioPlayerAgent, чтобы поток можно было воспроизводить за пределами моего приложения. Вот код, который я до сих пор:HttpWebRequest от AudioPlayerAgent

public AudioPlayer() 
    { 
     if (!_classInitialized) 
     { 
      _classInitialized = true; 
      // Subscribe to the managed exception handler 
      Deployment.Current.Dispatcher.BeginInvoke(delegate 
      { 
       Application.Current.UnhandledException += AudioPlayer_UnhandledException; 

      }); 
      trackTimer = new Timer(TrackTimerTick, null, 1000, 5000); 
     } 
    } 

    public void TrackTimerTick(object state) {    
      // Create a HttpWebrequest object to the desired URL. 
      HttpWebRequest trackRequest = (HttpWebRequest)HttpWebRequest.Create("<stream url>"); 
      // Start the asynchronous request. 
      IAsyncResult result = (IAsyncResult)trackRequest.BeginGetResponse(new AsyncCallback(TrackCallback), trackRequest); 
    } 

    public void TrackCallback(IAsyncResult result) { 
     if (BackgroundAudioPlayer.Instance.PlayerState == PlayState.Playing && result != null) { 
      try { 
       // State of request is asynchronous. 
       HttpWebRequest trackRequest = (HttpWebRequest)result.AsyncState; 
       HttpWebResponse trackResponse = (HttpWebResponse)trackRequest.EndGetResponse(result); 
       using (StreamReader httpwebStreamReader = new StreamReader(trackResponse.GetResponseStream())) { 
        string results = httpwebStreamReader.ReadToEnd(); 
        StringReader str = new StringReader(results); 
        XDocument trackXml = XDocument.Load(str); 

        string title = (from t in trackXml.Descendants("channel") select t.Element("title").Value).First<string>(); 
        string artist = (from t in trackXml.Descendants("channel") select t.Element("artist").Value).First<string>(); 
        if (BackgroundAudioPlayer.Instance.Track != null) { 
         AudioTrack track = BackgroundAudioPlayer.Instance.Track; 
         track.BeginEdit(); 
         track.Title = title; 
         track.Artist = artist; 
         track.EndEdit(); 
        } 

       } 
       trackResponse.Close(); 
       NotifyComplete(); 
      } catch (WebException e) { 
       Debug.WriteLine(e); 
       Debug.WriteLine(e.Response); 
      } catch (Exception e) { 
       Debug.WriteLine(e); 
      } 
     } 
    } 

Веб-исключение в любое время, что я пытаюсь прочитать ответ от HttpWebRequest. Правильно ли это? У кого-нибудь есть предложения относительно того, как я могу это исправить?

+0

Не поймайте Исключение. http://stackoverflow.com/questions/1742940/why-not-catch-general-exceptions http://msdn.microsoft.com/en-us/library/ms182137%28v=vs.100%29.aspx –

+0

Это ничего не исправить. – bfink

+0

Комментарий @Sedgwickz кажется частично исправленным, теперь я могу правильно получить данные трека. Однако, как только я вызываю NotifyComplete(), таймер больше не тикает - какие-либо советы о том, как исправить это? – bfink

ответ

0

Вы не закрываете HttpWebResponse, что необходимо. Кроме того, есть перегрузка XDocument.Load(), которая принимает Stream, поэтому вам не нужно использовать StreamReader.

EDIT: Извините, я пропустил вызов Close() в конце. Но другой комментарий по-прежнему применяется.

Если это не решает проблему, по крайней мере это делает ваш код смотреть уборщик:

public void TrackCallback(IAsyncResult result) { 
    if (BackgroundAudioPlayer.Instance.PlayerState == PlayState.Playing && result != null) { 
     try { 
      // State of request is asynchronous. 
      HttpWebRequest trackRequest = (HttpWebRequest)result.AsyncState; 
      using (HttpWebResponse trackResponse = (HttpWebResponse)trackRequest.EndGetResponse(result)){ 
       XDocument trackXml = XDocument.Load(trackResponse.GetResponseStream()); 

       string title = (from t in trackXml.Descendants("channel") select t.Element("title").Value).First<string>(); 
       string artist = (from t in trackXml.Descendants("channel") select t.Element("artist").Value).First<string>(); 
       if (BackgroundAudioPlayer.Instance.Track != null) { 
        AudioTrack track = BackgroundAudioPlayer.Instance.Track; 
        track.BeginEdit(); 
        track.Title = title; 
        track.Artist = artist; 
        track.EndEdit(); 
       } 
      } 
      } 
      NotifyComplete(); 
     } catch (WebException e) { 
      Debug.WriteLine(e); 
      Debug.WriteLine(e.Response); 
     } catch (Exception e) { 
      Debug.WriteLine(e); 
     } 
    } 
} 
+0

Спасибо за ответ. К сожалению, он все еще не работает, но мой код выглядит лучше :) – bfink

0

Я думаю, вы должны просто переместить функцию NotifyComplete() в OnUserAction() к вашему HttpWebRequest response.Maybe это статья может дать вам некоторую помощь :)

http://tmango.com/?p=952

0

Это связано с AudioPlayer выходя за рамки после того, как он начинает играть музыку. AudioPlayer живет только за часть времени и прекращается после вызова NotifyComplete

Посмотрите на мой ответ на это сообщение: AudioPlayerAgent, timer and webservice

Подробнее: фон аудио поток будет «приостановить» после NotifyComplete называется. Обратный путь - это когда пользователь меняет игру (OnUserAction) или когда песня заканчивается (OnPlayStateChanged). Если вы продолжите играть, получите новую информацию в методе OnPlayStateChanged.

+0

Благодарим за ответ. Вы говорите, что если я создам таймер внутри класса Songs, который вы укажете в своем ответе, этот таймер будет продолжать галочку? – bfink

+0

Я пробовал это, как я думаю, он должен работать, но таймер и любые вызовы async HttpWebRequest все равно прекращаются, когда я вызываю NotifyComplete. Любые советы по их размещению в фоновом потоке, которые не прекращаются при вызове NotifyComplete? – bfink

+0

Исправить, увидеть мои обновления –

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

  • Нет связанных вопросов^_^