gpt4 book ai didi

ios - Xamarin 表单 ListView CachingStrategy

转载 作者:可可西里 更新时间:2023-11-01 03:58:59 26 4
gpt4 key购买 nike

我最近测试了 Xamarin Forms 应用程序中 ListViewCachingStrategy,列表中有 1000 个项目。列表项是从 ViewCell 的数据模板创建的。我尝试为 CachingStrategy 使用 RecycleElement 选项。

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

为什么 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

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

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 支持的安卓版本: 4.0.3(API 级别 15) 4.4(API 级别 19) 5.0(API 级别 21) 5.1(API 级别 22) 6.0(API 级别 23)

SDK 工具版本:24.4.1SDK平台工具版本:23.1 rc1SDK构建工具版本:23.0.2

Java 开发工具包:/usrJava 版本“1.7.0_71”Java(TM) SE 运行时环境(build 1.7.0_71-b14)Java HotSpot(TM) 64 位服务器 VM(构建 24.71-b01,混合模式)

=== Xamarin Android 播放器 ===

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

=== Xamarin.Mac ===

版本:2.4.0.109(精简版)

=== 构建信息 ===

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

===操作系统===

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

最佳答案

这里有几件事要检查

  1. 在 Xamarin Profiler 中,确保您只查找自定义 ViewCell 类,并拍摄多个快照以触发垃圾收集器。如果 ViewCell 的数量没有增加,则可能是其他原因导致内存泄漏。如果 ViewCell 的数量在增加,请转到下面的建议 2 和 3。 Xamarin Profiler ViewCell example

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

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

使用 RecycleElement 的 ListView

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

View 单元格

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

关于ios - Xamarin 表单 ListView CachingStrategy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34249122/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com