首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WP8内存泄漏打开和关闭PhoneApplicationPage

WP8内存泄漏打开和关闭PhoneApplicationPage
EN

Stack Overflow用户
提问于 2013-07-05 23:57:32
回答 1查看 1.5K关注 0票数 3

我正在创建一个显示缩略图列表的Windows phone应用程序。我正在使用LongListSelector来做这件事。

当我多次向前和向后导航到缩略图列表时,我的应用程序有内存泄漏。我检查了使用应用程序时的内存使用情况,发现打开带有缩略图的页面时内存会增加(正如我所期望的那样)。当我导航回上一页时,内存使用量减少了,但没有增加那么多。重复该过程多次,它将以内存不足异常结束。

我创建了一个只有两个页面的测试应用程序。一个带有一个按钮导航到另一个,在LongListSelector中加载一组potos。我创建此应用程序是为了确保内存泄漏不是由其他原因引起的。

在这个简单的测试中,内存使用情况与我的应用程序中的一样。

下面是我的带有缩略图的页面的主要代码:

代码语言:javascript
复制
public class testObject
{
    public string Title { get; set; }
    public BitmapImage Thumbnail { get; set; }
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{

    photosList = new List<testObject>();
    for (int i = 0; i < 200; i++)
    {
        BitmapImage bi = new BitmapImage(new Uri("/images/"
                                        + i.ToString()+".jpg",
                                        UriKind.RelativeOrAbsolute));


        photosList.Add(new testObject { Title = i.ToString(),
                                            Thumbnail = bi });
    }

    GridPictures.ItemsSource = photosList;

}

protected override void OnBackKeyPress(
            System.ComponentModel.CancelEventArgs e)
{
    foreach (testObject test in photosList)
    {
        test.Thumbnail.DecodePixelHeight = 1;
        test.Thumbnail.DecodePixelWidth = 1;
        test.Thumbnail = null;
    }
    photosList.Clear();
    photosList = null;

    base.OnBackKeyPress(e);
}

下面是另一个页面上按钮的代码:

代码语言:javascript
复制
private void Button_Click_1(object sender, RoutedEventArgs e)
{
    NavigationService.Navigate(new Uri("/Page1.xaml", UriKind.RelativeOrAbsolute));

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-06 02:38:28

LongListSelector是已知的泄漏源。当您使用像Image这样的控件时,这些泄漏就变得特别麻烦,因为它使用了大量的内存。

到目前为止,最好的解决方案是完全避免LongListSelector。但是如果你找不到合适的替代方案,你有几个变通办法:

Page1中的

  • ,在OnNavigatedFrom事件中,强制释放图片。有几种方法可以做到这一点,但通常情况下,将ImageSource属性设置为null就足够了
  • 创建一个自定义控件来为您

完成繁琐的工作

自定义控件可能如下所示:

代码语言:javascript
复制
public class SafePicture : System.Windows.Controls.ContentControl
{
    public SafePicture()
    {
        this.Unloaded += this.SafePictureUnloaded;
    }

    private void SafePictureUnloaded(object sender, System.Windows.RoutedEventArgs e)
    {
        var image = this.Content as System.Windows.Controls.Image;

        if (image != null)
        {
            image.Source = null;
        }
    }
}

然后,只需将所有图片包装在该控件中:

代码语言:javascript
复制
<my:SafePicture>
    <Image Source="{Binding Path=Thumbnail}" />
</my:SafePicture>

这应该能起到作用。请注意,您仍然会泄漏内存,但泄漏的内存量要合理得多。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17492839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档