加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 22:12:47 所属栏目:百科 来源:网络整理
导读:我有一个ListView绑定到ObservableCollection对象(包含图像URI),当我向ListView添加更多项目时,我看到内存中出现了大量的峰值.我想我已经将其缩小到UserModel的imageUri的问题.见下文. public class UserModel : ObservableObject{ ... private string _imag
我有一个ListView绑定到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,value);
        }
    } 

}

ListView的Xaml绑定

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

列表视图模板

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

       ...

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

如您所见,我的ListView数据模板有两个图像,一个用于实际照片,另一个用于用户.两者都显示正确,但当我继续向列表中添加更多项目时,我看到内存大量飙升.

见图:

High Memory Profile

但是,如果我没有设置UserModel.imageUri(UserModel.imageUri为null,那么对于所有PhotoModel)我没有看到内存中的这个峰值.

Low Memory Profile

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

我认为问题与PhotoModel有UserModel和做Set(…)有关.从下面的照片中可以看出,属性更改事件处理程序的计数为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的DecodePixelHeight和DecodePixelWidth

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读