在Windows Phone 8上从XML创建大量UIElements后出现System.OutOfMemoryException

时间:2014-09-04 03:03:44

标签: c# windows-phone-8 out-of-memory

好吧,我是Windows Phone的新手。

我只是在读取包含大量数据的XML并将其保存在静态var上。 当我创建一个循环来显示我从XML获得的数据时,我创建了一个包含2个Textblock的Canvas。

但XML有近500行信息​​,因此该应用程序创建了500个Canvas和1000个TextBlocks。 当我尝试在页面之间移动时,应用程序变得太慢,有时会冻结,当我从那个页面移动到另一个页面时,内存不会被处理掉,而且几乎所有方法都会使应用程序崩溃并出现OutOfMemory Exception。

我想知道当我导航到另一个页面时,我是否可以做一些事情来处理应用程序上使用的内存,或者是否有某种方法可以在同一个XAML中使用更少的内存来显示所有这些数据。

OBS:只需加载页面即可使用近130MB的内存,手机只需150MB即可。

编辑:

private void empilharParticipantes()
{

    string nomeTitulo, nomeEmpresa;
    int margin = 0;
    SolidColorBrush corTexto = new SolidColorBrush();
    corTexto.Color = Color.FromArgb(255, 103, 103, 103);
    SolidColorBrush corCanvas = new SolidColorBrush();
    corCanvas.Color = Color.FromArgb(255, 242, 242, 242);

    items = from query in App.xmlParticipantes.Descendants("Participante")
            orderby query.Element("title").Value
            select new ABPI.Classes.Participantes
            {
                nome = (string)query.Element("title"),
                empresa = (string)query.Element("company"),
                email = (string)query.Element("email"),
                telefone = (string)query.Element("phone"),
                profissao = (string)query.Element("text"),
                endereco = (string)query.Element("address")
            };

                var itemsArray = items.ToArray();

                for (int i = 0; i < itemsArray.Count(); i++)
                {   
                    Canvas cnv = new Canvas { Name = itemsArray[i].nome, HorizontalAlignment = HorizontalAlignment.Left, Height = 90, Width = 420, Margin = new Thickness(30, margin, 0, 0), Background = corCanvas };


                    if (itemsArray[i].nome.Length > 30)
                    {
                        nomeTitulo = itemsArray[i].nome.Substring(0, 30) + "...";
                    }
                    else
                    {
                        nomeTitulo = itemsArray[i].nome;
                    }

                    if (itemsArray[i].empresa.Length > 35)
                    {
                        nomeEmpresa = itemsArray[i].empresa.Substring(0, 35) + "...";
                    }
                    else
                    {
                        nomeEmpresa = itemsArray[i].empresa;
                    }

                    TextBlock titulo = new TextBlock { Text = nomeTitulo, TextWrapping = TextWrapping.Wrap, FontSize = 25, Foreground = corTexto };
                    Canvas.SetLeft(titulo, 30);
                    Canvas.SetTop(titulo, 15);

                    TextBlock empresa = new TextBlock { TextWrapping = TextWrapping.Wrap, Text = nomeEmpresa, FontSize = 20, Foreground = corTexto };
                    Canvas.SetLeft(empresa, 30);
                    Canvas.SetTop(empresa, 45);

                    cnv.Tap += new EventHandler<System.Windows.Input.GestureEventArgs>(uriParametro);

                    cnv.Children.Add(titulo);
                    cnv.Children.Add(empresa);

                    content.Children.Add(cnv);

                    margin = margin + 100;

                }

                txtbusca2.ItemsSource = lista;

                ContentPanel.Height = margin;
                content.Height = margin;
                oScroll.Content = content;

在循环之后,我将Canvas(内容)放在ScrollViewer(oScroll)中,但是当我离开页面时,内存没有被丢弃,所以当我尝试去其他地方时,应用程序崩溃了。 OutOfMemoryException异常

1 个答案:

答案 0 :(得分:0)

您需要明确删除这些控件。处理Unloaded事件或覆盖OnNavigatedFrom()方法,只需删除所有子项。

LayoutRoot.Children.Clear();