我最近在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
答案 0 :(得分:1)
在Xamarin Profiler中,确保您只查找自定义ViewCell类,并使用多个快照来触发垃圾收集器。如果ViewCells的数量没有增加,它可能会导致内存泄漏。如果ViewCells的数量在增加,请转到建议2& 3,下面。 Xamarin Profiler ViewCell example
在ViewCell代码中,请务必覆盖OnBindingContextChanged()
并在OnBindingContextChanged()
中设置控件的属性,而不是在ViewCell的构造函数中。我在下面添加了一些示例代码,演示了如何使用自定义ViewCell实现ListViewCachingStrategy.RecycleElement
策略。
OnAppearing()
方法中订阅事件处理程序并取消订阅事件处理程序在ViewCell类的OnDisappearing()
方法中。我在下面的示例ViewCell代码中添加了注释。ListView = new ListView(ListViewCachingStrategy.RecycleElement)
{
DataTemplate(typeof(CustomViewCell))
};
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
}
}
public class MyModel
{
[PrimaryKey]
public int ID { get; set; }
public string Text { get; set; }
}