ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

WP8内存泄漏打开和关闭PhoneApplicationPage

2019-11-23 03:06:14  阅读:322  来源: 互联网

标签:longlistselector windows-phone-8 out-of-memory memory-leaks c


我正在创建一个显示缩略图列表的Windows Phone应用程序.我正在使用LongListSelector做到这一点.

当我前后导航到缩略图列表时,我的应用程序存在内存泄漏.我在使用该应用程序时查看了内存使用情况,并且发现打开带有缩略图的页面时内存增加了(正如我期望的那样).当我导航回到上一页时,内存使用量减少了,但增加的却不多.重复执行几次该过程将导致内存不足异常.

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

在此简单测试中,内存使用情况与我的应用程序相同.

这是我的页面的主要代码:

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

这是另一页上按钮的代码:

private void Button_Click_1(object sender, RoutedEventArgs e)
{
    NavigationService.Navigate(new Uri("/Page1.xaml", UriKind.RelativeOrAbsolute));

}

解决方法:

LongListSelector是已知的泄漏源.当您使用诸如Image之类的控件时,这些泄漏尤其麻烦,该控件占用大量内存.

到目前为止,最好的解决方案是完全避免使用LongListSelector.但是,您找不到合适的替代方法,但是有一些解决方法:

>在Page1的OnNavigatedFrom事件中,强制释放图片.有几种方法可以做到,但是通常将ImageSource属性设置为null就足够了
>进行自定义控件,为您完成肮脏的工作

自定义控件可能类似于:

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

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

<my:SafePicture>
    <Image Source="{Binding Path=Thumbnail}" />
</my:SafePicture>

这应该可以解决问题.请注意,您仍然会泄漏内存,但数量要合理得多.

标签:longlistselector,windows-phone-8,out-of-memory,memory-leaks,c
来源: https://codeday.me/bug/20191123/2064785.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有