c# - ListView 内存泄漏 Windows Phone 8.1?

标签 c# listview memory-leaks windows-phone-8.1 mvvm-light

我有一个 ListView 绑定(bind)到对象的 ObservableCollection(包含图像 URI),当我向 ListView 添加更多项目时,我看到内存中出现大量峰值。我想我已经将其缩小为 UserModel 的 imageUri 的问题。见下文。

public class UserModel : ObservableObject
{
    ...
     private string _imageUri;
    ...


    ...
    public string ImageUri
    {
        get
        {
            return _imageUri;
        }
        set
        {
            Set(() => ImageUri, ref _imageUri, value);
        }
    } 
}

照片模型

public class PhotoModel : ObservableObject
{
    ...
    private UserModel _user;
    private string _imageUri;
    ...

    ...
    public UserModel User
    {
        get
        {
            return _user;
        }
        set
        {
            Set(() => User, ref _user, value);
        }
    }

    public string ImageUri
    {
        get
        {
            return _imageUri;
        }
        set
        {
            Set(() => ImageUri, ref _imageUri, value);
        }
    } 

}

ListView的Xaml绑定(bind)

<ListView
      x:Name="MostPopularListView"
      ItemsSource="{Binding PhotosCollection}"
      ItemTemplate="{StaticResource MostPopularDataTemplate}"
      Margin="0,0,0,0"
      IsItemClickEnabled="True"/>

ListView 模板

       ...
       <Image 
          Source="{Binding ImageUri}"             
          Stretch="Fill" 
          Height="300" />

       ...

       <Ellipse 
            Width="40"
            Height="40" 
            Margin="10,0,0,10">
            <Ellipse.Fill>
                 <ImageBrush>
                     <ImageBrush.ImageSource>
                         <BitmapImage UriSource="{Binding User.ImageUri}" />
                            </ImageBrush.ImageSource>
                      </ImageBrush>
                 </Ellipse.Fill>
            </Ellipse>
            ...

如您所见,我的 ListView 数据模板有两张图片,一张用于实际照片,一张用于用户。两者都正确显示,但是当我继续向列表中添加更多项目时,我发现内存出现了巨大的峰值。

见图片: High Memory Profile

但是,如果我不设置 UserModel.imageUri(对于所有 PhotoModel,UserModel.imageUri 为 null)我不会在内存中看到这个峰值。 Low Memory Profile

两个配置文件都执行相同的操作加载相同的图像(总共 15 个)。第一张照片带有用户照片,第二张截图没有。

我认为问题与具有 UserModel 并执行 Set(...) 的 PhotoModel 有关。从下面的照片中可以看出,属性更改事件处理程序的计数为 140。

Profile1 enter image description here

其中大部分是 PhotoModels,但我的收藏中最多只有 15 个 PhotoModels。我使用两种扩展方法清除并重新添加(可能是你造成的)。

     public static void Repopulate<T>(this ICollection<T> collection, IEnumerable<T> items)
    {
        collection.Clear();
        foreach (var item in items)
        {
            collection.Add(item);
        }
    }

    public static void AddObjects<T>(this ICollection<T> collection, IEnumerable<T> items)
    {
        foreach (var item in items)
        {
            collection.Add(item);
        }
    }

我非常感谢有关如何更好地处理性能以及这是否是内存泄漏的建议。

最佳答案

问题在于 ImageBrush 如何解码较大的图像。您需要设置 BitmapImage

DecodePixelHeightDecodePixelWidth

来源:http://timheuer.com/blog/archive/2015/05/06/making-circular-images-in-xaml-easily.aspx

关于c# - ListView 内存泄漏 Windows Phone 8.1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29590570/

相关文章:

c# - 在 ASP.NET 中将事件从页面发送到其母版页

c# - 从 ASP .NET Core Web API 方法返回完整的 XML 响应

Android <include> ListView 没有占据它的高度

C# GTK 拖放

android - Android中如何实现多级ExpandableListview?

objective-c - 仪器泄漏/怪异的内存泄漏

c# - 如何使用每个选项卡的 PID 获取 Internet Explorer 选项卡的 URL?

c# - 为什么 Entity Framework 会尝试选择所有列,即使我只指定了两个列?

java - 使用 7mb RAM 的 Android FinalizerReference

.net - EndInvoke() - 可选或不可选?