音楽を聴いたりビデオを見たりするアプリを書いています。アプリには、次の 2 つのページがあります。1 つはオーディオ再生エージェント (APA) を再生するページ A、もう 1 つはビデオを再生するページ (MediaElement を使用) - ページ B です。一方、WP8 には APA に関するバグがあります (ここで尋ねます(私は解決策を見つけました-MediaElementが再生されて閉じるときの前後にAPAを2回停止します)。
問題は、A ページで DispatcherTimer ティックを毎秒使用して APA インスタンスの位置を確認していたことです。このページを離れると、この DispatcherTimer を停止する機能があります。
それでも、ページ A に何度か移動してからページ B に移動すると、1 秒後にアプリが例外をスローしましたif (BackgroundAudioPlayer.Instance.PlayerState == ...
。これは、DispatcherTimer がまだティックしているということです ????? これを強制的に停止するにはどうすればよいですか :(
DispatcherTimer に関連するすべてのコードをここに投稿しました。
public DetailSongPage()
{
InitializeComponent();
this.DataContext = App.Model;
BackgroundAudioPlayer.Instance.PlayStateChanged += APA_Instance_PlayStateChanged;
}
DispatcherTimer timer = null;
private void APA_Instance_PlayStateChanged(object sender, EventArgs e)
{
if (BackgroundAudioPlayer.Instance.PlayerState == PlayState.Playing)
{
UpdateTracking();
}
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if (BackgroundAudioPlayer.Instance.PlayerState == PlayState.Playing || BackgroundAudioPlayer.Instance.PlayerState == PlayState.Paused)
{
UpdateTracking();
}
}
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
base.OnNavigatedFrom(e);
timer.Stop();
timer.Tick -= timer_Tick;
timer = null;
}
private void UpdateTracking()
{
sldTracking.Maximum = BackgroundAudioPlayer.Instance.Track.Duration.TotalMilliseconds;
tbMaxTime.Text = string.Format(@"{0:mm\:ss}",BackgroundAudioPlayer.Instance.Track.Duration);
// ^ these 2 lines update the UI for the slider and textblock
if (timer == null)
{
timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromMilliseconds(1000);
timer.Tick += timer_Tick;
timer.Start();
}
}
private void timer_Tick(object sender, EventArgs e)
{
if (this.timer != null)
{
try
{
if (BackgroundAudioPlayer.Instance.PlayerState == PlayState.Playing || BackgroundAudioPlayer.Instance.PlayerState == PlayState.Paused)
{
sldTracking.Value = BackgroundAudioPlayer.Instance.Position.TotalMilliseconds;
tbCurrentTime.Text = string.Format(@"{0:mm\:ss}", BackgroundAudioPlayer.Instance.Position);
}
}
catch
{
return;
}
}
}