【问题标题】:How to prevent OutOfMemoryException?如何防止 OutOfMemoryException?
【发布时间】:2014-03-09 11:34:26
【问题描述】:

我有一个应用程序可以在 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));

【问题讨论】:

  • 发布“转到”另一个/新页面的代码。
  • @HenkHolterman 没什么特别的,有 NavigationService。已更新。

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


【解决方案1】:

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

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

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

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
    }
}

【讨论】:

  • 太好了,谢谢@Kookiz。就像一个简短的问题,如果它必须深入到不同的页面,我该怎么办?有什么建议吗?
  • @user3293835 我会说,覆盖页面的OnNavigatedFrom事件并将所有图片的来源设置为null以释放内存,然后在OnNavigatedTo事件中重新加载图片
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-27
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多