Xamarin表单ListView CachingStrategy

我最近在列表中有1000个项目的Xamarin Forms App中testing了ListViewCachingStrategy 。 列表项是从ViewCell的数据模板创build的。 我尝试使用RecycleElement选项。

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

为什么RecycleElement不适用于iOS(iPhone)?

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

=== Xamarin工作室===

版本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

===苹果开发者工具===

Xcode 7.1.1(9081)Build 7B1005

=== Xamarin.iOS ===

版本:9.2.1.54(企业版)Hash:eb4c1ef分支:masterbuild立date: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 21)5.1(API等级22)6.0(API等级23)

SDK工具版本:24.4.1 SDK平台工具版本:23.1 rc1 SDK构build工具版本:23.0.2

Java SDK:/ usr Java版本“1.7.0_71”Java™SE运行时环境(build 1.7.0_71-b14)Java HotSpot™64位服务器虚拟机(版本24.71-b01,混合模式)

=== Xamarin Android播放器===

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

=== Xamarin.Mac ===

版本:2.4.0.109(精简版)

===构build信息===

发行编号:510010003 Git修订版:f2021a209d66d49cbc0649a6d968b29040e57807开发date:2015-12-01 10:43:40-05 Xamarin插件:dfd4f5103e8951edbc8ac24480b53b53c55e04ff搭build车道: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. 在Xamarin Profiler中,确保您只查找自定义的ViewCell类,并拍摄多个快照来触发垃圾收集器。 如果ViewCells的数量没有增加,那么可能会导致内存泄漏。 如果ViewCell的数量正在增加,请转到下面的build议2和3。 Xamarin Profiler ViewCell示例

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

  3. 如果您正在为ViewCell订阅事件处理程序(例如,添加一个上下文动作 ),请确保在ViewCell类的OnAppearing()方法中订阅事件处理程序,并在OnDisappearing()方法中取消订阅事件处理程序ViewCell类。 我在下面的示例ViewCell代码中包含了一条评论。

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; } }