【问题标题】:Memory Leak in Windows Phone 8 ApplicationWindows Phone 8 应用程序中的内存泄漏
【发布时间】:2014-03-13 13:13:36
【问题描述】:

我正在尝试创建一个包含图像及其一些详细信息的列表框。 代码如下:

<ListBox x:Name="GalleryImages" ItemsSource="{Binding}">
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel VirtualizingStackPanel.VirtualizationMode="Recycling" Orientation="Vertical" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Disabled" HorizontalAlignment="Center"/>
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid VerticalAlignment="Top">
                    <Image Source="{Binding Path=ImageSrc}" Height="200" Width="480" Stretch="Fill"/>
                    <Border BorderThickness="5" BorderBrush="White" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="10" >
                        <StackPanel HorizontalAlignment="Center" Background="White" Opacity="0.6">
                            <TextBlock Text="{Binding Path=Time}" Foreground="Black" HorizontalAlignment="Center" Padding="10,5,10,0" FontSize="12" />
                            <TextBlock Text="{Binding Path=Day}" Foreground="Black" HorizontalAlignment="Center"  FontSize="45" FontWeight="Bold" Padding="10,0,10,10" Margin="0,-10,0,-18"/>
                            <TextBlock Text="{Binding Path=MonthAndYear}" Foreground="Black" HorizontalAlignment="Center" FontSize="17" Padding="10,0,10,5"/>
                        </StackPanel>
                    </Border>
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

支持的代码是:

public class Item
    {
        public ImageSource ImageSrc { get; set; }
        public string Time { get; set; }
        public string Day { get; set; }
        public string MonthAndYear { get; set; }
    }

//Creating a New Item
//Added the time,day, monthandyear
//Now adding the image source
//This will be looped each time for each image

Item item = new Item();
using (IsolatedStorageFile ISF = IsolatedStorageFile.GetUserStoreForApplication())
{
     if (ISF.DirectoryExists("SomeDirectory"))
     using (IsolatedStorageFileStream FS = ISF.OpenFile("SomeDirectory/" + "SOMERANDOMIMAGENAME", FileMode.Open, FileAccess.Read))
     {
            BitmapImage bitmap = new BitmapImage();
            bitmap.SetSource(FS);
            item.ImageSrc = bitmap;
      }
 }

最后将项目一一绑定到之前创建的列表框:

 Dispatcher.BeginInvoke(() => GalleryImages.Items.Add(item));

现在的问题是: 如您所见,所有列表框图像都使用新的位图图像从独立存储中获取,然后将其设置为 item.ImageSrc。但是当项目超过 25 时,它会产生内存泄漏,并且应用程序在 显示图像

后崩溃

到目前为止我尝试了什么,

  1. 添加了 virtualizingstackpanel,它可以工作,但不适用于超过 25 个的图像。
  2. 在将项目添加到 GalleryImage(ListBox) 项目后立即设置 item.ImageSrc = null,但这会使 ListBox 的图像也为 null。

对于超过 1000 张的图像,我还能做些什么来解决这个问题??

【问题讨论】:

    标签: c# windows-phone msdn


    【解决方案1】:

    在处理包含图像的集合时,不仅 UI 控件显示需要大量内存的集合,而且集合本身也是如此。因此,除了UI Virtualization 之外,请尝试查看Data Virtualization

    使用数据虚拟化,并非集合中的所有项目一次都加载到内存中。仅加载了其中的一部分,当前需要显示的部分以及作为 缓冲区 的几个下一个项目。

    【讨论】:

    • 数据虚拟化和 UI 虚拟化是同一个概念吗?他们俩或任何人都支持windows phone 8吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多