如何防止OutOfMemoryException?

时间:2014-03-09 11:34:26

标签: c# xaml windows-phone-7 windows-phone-8 windows-phone

我有一个应用程序,可以在SkyD中显示某人的图像..哦OneDrive!

这是一个场景:从MainPage.xaml传递imageId并转到ImagePage.xaml。然后从ImagePage.xaml内部深入到新ImagePage.xaml等等。

ImagePage.xaml有一个像这样的大图:

<Image Source="{Binding ImageUrl}" Stretch="Uniform" Margin="12"/>

问题在于,当它变得更深时,会在某个时刻达到内存限制并退出。

问题是,如何预防OutOfMemoryException?我想到了一种在深入或更深入之前卸载页面的方法。感谢。

来自ImagePage内的

更新

NavigationService.Navigate(new Uri("/ImagePage.xaml?Id=" + id, UriKind.Relative));

1 个答案:

答案 0 :(得分:2)

导航到新页面时,前一页保留在内存中。如果你继续这样做,你最终将会耗尽内存,就像你一样。

在您的情况下,我认为最好的解决方案是重新考虑您的页面流。基本上,不是每次都导航到新的页面实例,而是保持在同一页面并显示新图片。还要跟踪所需的图片。这样,当用户按下后退按钮时,您可以检查历史记录中是否有图片并将其显示回来而不是返回上一页。

总而言之,您首先需要存储图片历史记录。 Stack非常适合这个目的:

private Stack<string> History { get; set; }

当您需要显示新图片时(之前您曾导航过ImagePage.xaml),请将上一张图片添加到历史记录中并显示新图片:

this.History.Push(oldPicture);
// Load the new picture

然后,在OnBackKeyPressed事件中,如果历史记录不为空,则取消导航。否则,检索最新条目并显示它:

protected override void OnBackKeyPress(CancelEventArgs e)
{
    if (this.History.Count > 0)
    {
        e.Cancel = true;
        var picture = this.History.Pop();
        // Display the picture
    }
}