Xamarin表单ListView CachingStrategy

时间:2015-12-13 08:02:21

标签: ios xamarin xamarin.forms xamarin-studio xamarin.mac

我最近在Xamarin Forms App中测试了CachingStrategy ListView,列表中有1000个项目。正在使用ViewCell的数据模板创建列表项。我尝试使用RecycleElement选项CachingStrategy

当我使用Xamarin Profiler对在Xamarin Anroid Player(模拟器)上部署的Android App进行分析时,我注意到当我滚动列表时,内存分配不会增加(在分配摘要选项卡上)。但是,当我在模拟器上对iPhone App进行性能分析时,我注意到Allocations Summary选项卡上没有显示任何数据。因此,我在滚动列表时捕获了一些快照,并注意到每当我滚动列表(向上或向下)时,内存分配不断增加。

为什么RecycleElement无法用于iOS(iPhone)?

我正在使用Mac进行开发。 以下是我的工具:

=== Xamarin Studio ===

版本5.10.1(版本3) 安装UUID:7ae992a3-b710-4297-ba1d-0c519fbb2ea8 运行:     单声道4.2.1(显式/ 6dd2d0d)     GTK + 2.24.23(罗利主题)

Package version: 402010102

=== Xamarin.Profiler ===

版本:0.24.0.0 地点:/ Applications / Xamarin Profiler.app/Contents/MacOS/Xamarin Profiler

=== Apple Developer Tools ===

Xcode 7.1.1(9081) 建立7B1005

=== Xamarin.iOS ===

版本:9.2.1.54(企业版) 哈希:eb4c1ef 科:硕士 建设日期:2015-12-01 02:12:30-0500

=== Xamarin.Android ===

版本:6.0.0.34(企业版) Android SDK:/ Users / haider / Library / Developer / Xamarin / android-sdk-macosx     支持的Android版本:         4.0.3(API级别15)         4.4(API级别19)         5.0(API级别21)         5.1(API级别22)         6.0(API级别23)

SDK工具版本:24.4.1 SDK平台工具版本:23.1 rc1 SDK Build Tools版本:23.0.2

Java SDK:/ usr java版“1.7.0_71” Java(TM)SE运行时环境(版本1.7.0_71-b14) Java HotSpot(TM)64位服务器VM(内置24.71-b01,混合模式)

=== Xamarin Android Player ===

版本:0.6.5 位置:/ Applications / Xamarin Android Player.app

=== Xamarin.Mac ===

版本:2.4.0.109(简化版)

===建立信息===

版本号:510010003 Git修订版:f2021a209d66d49cbc0649a6d968b29040e57807 建设日期:2015-12-01 10:43:40-05 Xamarin插件:dfd4f5103e8951edbc8ac24480b53b53c55e04ff 建立车道:monodevelop-lion-cycle6-baseline

===操作系统===

Mac OS X 10.11.1 Darwin Haiders-MacBook-Pro.local 15.0.0 Darwin内核版本15.0.0     9月19日星期六15:53:46 PDT 2015     root:xnu-3247.10.11~1 / RELEASE_X86_64 x86_64

1 个答案:

答案 0 :(得分:1)

这里有几件事需要检查

  1. 在Xamarin Profiler中,确保您只查找自定义ViewCell类,并使用多个快照来触发垃圾收集器。如果ViewCells的数量没有增加,它可能会导致内存泄漏。如果ViewCells的数量在增加,请转到建议2& 3,下面。 Xamarin Profiler ViewCell example

  2. 在ViewCell代码中,请务必覆盖OnBindingContextChanged()并在OnBindingContextChanged()中设置控件的属性,而不是在ViewCell的构造函数中。我在下面添加了一些示例代码,演示了如何使用自定义ViewCell实现ListViewCachingStrategy.RecycleElement策略。

  3. 如果您正在为ViewCell订阅事件处理程序(例如添加Context Action),请确保在ViewCell类的OnAppearing()方法中订阅事件处理程序并取消订阅事件处理程序在ViewCell类的OnDisappearing()方法中。我在下面的示例ViewCell代码中添加了注释。
  4. ListView使用RecycleElement

    ListView = new ListView(ListViewCachingStrategy.RecycleElement)
    {
        DataTemplate(typeof(CustomViewCell))
    };
    

    ViewCell

    public class CustomViewCell : ViewCell
    {
        Label _myLabel;
        MenuItem _deleteAction;
    
        public CustomViewCell()
        {
            _myLabel = new Label();
    
            View = _myLabel;
        }
    
        protected override void OnBindingContextChanged()
        {
            base.OnBindingContextChanged();
    
            _myLabel.Text = "";
    
            var item = BindingContext as MyModel;
            if (item != null)
            {
                _myLabel.Text = item.Text;
            }
        }
    
        protected override void OnAppearing()
        {
            base.OnAppearing();
    
            //Subscribe ViewCell Event Handlers
            _deleteAction.Clicked += HandleDeleteClicked;
            ContextActions.Add(_deleteAction);
        }
    
        protected override void OnDisappearing()
        {
            base.OnDisappearing();
    
            //Unsubscribe ViewCell Event Handlers
            _deleteAction.Clicked -= HandleDeleteClicked;
            ContextActions.Remove(_deleteAction);
        }
    
        void HandleDeleteClicked(object sender, EventArgs e)
        {
            //Code to handle when the delete action is tapped
        }
    }
    

    ViewCell模型

    public class MyModel
    {
        [PrimaryKey]
        public int ID { get; set; }
    
        public string Text { get; set; }
    }