Xamarin Forms ListView CachingStrategy

Недавно я протестировал CachingStrategy для ListView в приложении Xamarin Forms с 1000 элементами в списке. Элементы списка создаются из шаблона данных ViewCell . Я пробовал использовать параметр CachingStrategy для CachingStrategy .

Когда я делал профилирование, используя Xamarin Profiler, для Android App, развернутого на Xamarin Anroid Player (эмулятор), я заметил, что когда я просматриваю список, распределение памяти не увеличивается (на вкладке сводок распределения). Но, когда я делал профилирование для iPhone App на эмуляторе, я заметил, что на вкладке «Сводка сумм» данные не отображаются. Таким образом, я захватил некоторые снимки, прокручивая список и заметил, что всякий раз, когда я просматриваю список (вверх или вниз), распределение памяти продолжает увеличиваться.

Почему RecycleElement не работает для iOS (iPhone)?

Я использую Mac для разработки. Вот мои инструменты:

=== Xamarin Studio ===

Версия 5.10.1 (сборка 3) Установка UUID: 7ae992a3-b710-4297-ba1d-0c519fbb2ea8 Время выполнения: Mono 4.2.1 (явное / 6dd2d0d) GTK + 2.24.23 (тема Raleigh)

 Package version: 402010102 

=== Xamarin.Profiler ===

Версия: 0.24.0.0 Местоположение: / Приложения / Xamarin Profiler.app/Contents/MacOS/Xamarin Profiler

=== Инструменты разработчика Apple ===

Xcode 7.1.1 (9081) Build 7B1005

=== Xamarin.iOS ===

Версия: 9.2.1.54 (Enterprise Edition) Хэш: eb4c1ef Отрасль: мастер Дата сборки: 2015-12-01 02: 12: 30-0500

=== Xamarin.Android ===

Версия: 6.0.0.34 (Enterprise Edition) Android SDK: / Пользователи / 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 Tools Версия: 24.4.1 Инструменты платформы SDK Версия: 23.1 rc1 SDK Build Tools Версия: 23.0.2

Java SDK: / usr java version "1.7.0_71" Java (TM) SE Runtime Environment (build 1.7.0_71-b14) 64-разрядная серверная виртуальная машина Java HotSpot TM (сборка 24.71-b01, смешанный режим)

=== Xamarin Android Player ===

Версия: 0.6.5 Местоположение: / Приложения / 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-baseeline

=== Операционная система ===

Mac OS X 10.11.1 Darwin Haiders-MacBook-Pro.local 15.0.0 Darwin Kernel Версия 15.0.0 Сб Сен 19 15:53:46 PDT 2015 root: xnu-3247.10.11 ~ 1 / RELEASE_X86_64 x86_64

Вот несколько вещей для проверки

  1. В Xamarin Profiler убедитесь, что вы ищете только собственный класс ViewCell и выполняете несколько снимков, чтобы запустить сборщик мусора. Возможно, что-то другое вызывает утечку памяти, если количество ViewCells не увеличивается. Если количество ViewCells увеличивается, перейдите к предложениям 2 и 3 ниже. Пример приложения Xamarin Profiler ViewCell

  2. В коде ViewCell обязательно переопределите OnBindingContextChanged() и установите свойства элементов управления в OnBindingContextChanged() , а не в конструкторе ViewCell. Я добавил несколько примеров кода, который показывает, как реализовать стратегию ListViewCachingStrategy.RecycleElement с помощью настраиваемого ViewCell.

  3. Если вы подписываете обработчик событий для ViewCell (например, для добавления действия контекста ), обязательно подпишите обработчик событий в OnAppearing() класса ViewCell и отмените подписку обработчика событий в 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; } } 
Interesting Posts
Давайте будем гением компьютера.