ObservableCollection的Android / Xamarin / Telerik内存问题

时间:2017-11-23 16:04:32

标签: android xamarin telerik

我有一个需要更新的列表视图(与使用静态列表的所有示例代码不同)。 xaml /代码片段如下所示:

<telerikDataControls:RadListView x:Name="processesListView" ItemsSource="{Binding Items, Mode=OneWay}"
    SelectionMode="Single"
    Grid.Row="2">

class ActionProcessItemViewModel : NotifyPropertyChangedBase { 
// etc.
}

class ActionProcessesViewModel : NotifyPropertyChangedBase
{
    ObservableCollection<ActionProcessItemViewModel> _items = new ObservableCollection<ActionProcessItemViewModel>();

    internal ActionProcessesViewModel()
    {
    }

    internal ObservableCollection<ActionProcessItemViewModel> Items => _items;

    // this is an update not a replace: incoming list may be a partial snapshot
    internal void UpdateItems(List<ActionProcessItemViewModel> updatedItems)
    {
        // remove any about-to-be-replaced items
        foreach (ActionProcessItemViewModel it in updatedItems)
        {
            var itemsRows = _items.Where(row => row.ActionProcess.Id == it.ActionProcess.Id);
            if (itemsRows.Count() == 1)
               _items.Remove(itemsRows.First());
        }

        foreach (ActionProcessItemViewModel it in updatedItems)
            _items.Add(it);

        var sorted = Sort(_items.ToList());
        _items.Clear(); // replace 'items' with the sorted list

        foreach (ActionProcessItemViewModel ap in sorted)
            _items.Add(ap);

        OnPropertyChanged("Items");
    }

    private List<ActionProcessItemViewModel> Sort(List<ActionProcessItemViewModel> items)
    {
        return items
             .OrderByDescending(o => o.CurrentState?.Time.Ticks).ToList()
             .OrderByDescending(o => o.CurrentState?.Severity).ToList()
             .OrderBy(o => o.CurrentState?.Type).ToList()
             ;
    }

我知道更新_items会导致内存泄漏。我认为。垃圾收集,或没有垃圾收集,使得很难知道什么是泄漏,什么不是。我使用了Xamarin Profiler,它确认了很多Xamarin.Forms.BindableObject.BindablePropertyContext的分配。 正在查看Xamarin / Telerik / ObservableCollection文档和内容,但无法找到任何说我应该在这里做一些特别的事情。如何修复内存泄漏?

[我尝试过各种各样的事情来看待这种影响;喜欢跳过排序,这没什么用。我也尝试过根本不更新列表,这有很大的帮助(这不是唯一的内存泄漏,只是最糟糕的内存泄漏)。 ]

0 个答案:

没有答案