Жизненный цикл компонентов Component Lifecycle Overview Павел Кожин [email_address] Exigen Services
Что такое жизненный цикл и для чего он нужен   Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора Construction Configuration Attachment Initialization Invalidation Interaction Detachment Garbage Collection
Единая концепция   Управление Детализация Переопределение createChildren() commitProperties() measure() updateDisplayList()
Фаза 1
Инстанциирование Подписка на события Применение стилей Создание дочерних элементов <local:MyCopm/> var comp:MyComp = new MyCopm(); comp.setStyle(“…”, “…”); public function MyCopm { super(); addEventListener( MouseEvent.CLICK, clickHandler); } Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора 1
Конструктор systemManager, stage, root getStyle()  ( ждём  createChildren()) Повторное выполнение кода Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора <my:CustomBtn/> var btn:CustomBtn = new CustomBtn(); btn.setStyle(“…”, “…”); public function CustomBtn { super(); addEventListener( MouseEvent.CLICK, clickHandler); } 1
get/set  методы Выполняются до инициализации Максимально быстрые! Использовать валидацию Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора var foo:Array = [“Hello”, “World!”]; public function set data(val:Array):void{ _data = val; dataChanged = true; invalidateProperties(); } 1
Фаза 2
Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора parentComponent.addChild(instance); 2 addChild() / addChildAt() initialize() Вызов вручную для  не визуальных компонентов
Фазы инициализации 1. Событие  “preinitialize” 2. createChildren() initialize() Дети Родители 4. Валидация Событие  “creationComplete” Committed Measured Updated Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора 2
createChildren() Переопределение Перманентных подкомпоненты «Создание – Конфигурация – Присоединение» super.createChildren() Динамику отложим до валидации! Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора 2
Пример переопределения protected var closeButon:UIComponent; override protected function  createChildren():void{ if (!closeButton){ closButton = new Button(); Button(closeButton).label = “x”; } addChild(closeButton); closeButton.addEventListener( MouseEvent.CLICK, clickHandler); super.createChildren(); } Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора 2
Отложенная валидация Отложить обработку изменений Сохранить высокую производительность Функции инвалидации invalidateProperties() invalidateSize() invalidateDisplayList() Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора 2
Валидация: роль  LayoutManager Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора 2 LayoutManager invalidatePropertiesQueue invalidateSizeQueue invalidateDisplayListQueue validateProperties() validateSize() validateDisplayList()
commitProperties() Обработка динамических данных Используем флаги! Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора 2 invalidateProperties() validateProperties() commitProperties()
Пример  commitProperties() public function set historyManagementEnabled(value:Boolean) : void{ if (value != _historyManagementEnabled){ _historyManagementEnabled = value ; historyManagementEnabledChanged = true; invalidateProperties(); } } Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора 2
measure() Предпочтительный размер measuredWidth / measuredHeight measuredMinWidth / measureMinHeight Вызывается автоматически Не вызывается при  explicitWidth / explicitHeight Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора 2 invalidateSize() validateSize() masure()
Пример  measure() override protected function measure():void { for (var i:int = 0; i < numChildren; ++i){ var child:UIComponent = UIComponent(getChildAt()) measuredHeight += child.getExplicitOrMeasuredHeight() + VERTICAL_GAP; } measuredMinWidth = 10; measuredMinHeight = measuredHeight; } Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора 2
updateDisplayList() Дочерние елементы Позиционирование размер Drawing API Актуальный размер выставляется здесь! Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора 2 invalidateDisplayList() validateDisplayList() updateDisplayList()
Пример  updateDisplayList() override protected function updateDisplayList():void{ … item.data = data; UIComponentGlobals.layoutManager.validateClient( item, true); var w:Number = item.getExplicitOrMeasuredWidth(); item.setActualSize(w, h); item.move(x, y); } Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора 2
Размеры Measured (measuredWidth) Предпочтительный размер Вычисляется  measure() Explicit (explicitWidth) Присваивается пользователем <mx:Button width=“100”/> Percentage   (percentWidth) Присваивается пользователем Вычисляется родителем <mx:Button width=“100%”/> Actual setActualSize() Присваивается в  updateDisplayList()  родителем Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора 2
Фаза 3
Отдельная тема Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора 3
Фаза 4
Уборка Методы удаления removeChild() removeChildAt() removeAllChildren() visible=false  для постоянных элементов Сборщик мусора Ссылки на объект Обработчики событий binding Dictionary Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора 4
Сравнение цикла  MX(AS2)  и  Flex  destroyObject(id:String) removeChild invalidateSize invalidateDisplayList redraw commitProperties redraw measure draw / size updateDisplayList invalidate invalidateProperties removeChildAt createChildren createChildren init initialize createObject / createClassObject addChild/addChildAt
Вопросы? Павел Кожин [email_address] Exigen Services

Flex Component Lifecycle Overview

  • 1.
    Жизненный цикл компонентовComponent Lifecycle Overview Павел Кожин [email_address] Exigen Services
  • 2.
    Что такое жизненныйцикл и для чего он нужен Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора Construction Configuration Attachment Initialization Invalidation Interaction Detachment Garbage Collection
  • 3.
    Единая концепция Управление Детализация Переопределение createChildren() commitProperties() measure() updateDisplayList()
  • 4.
  • 5.
    Инстанциирование Подписка насобытия Применение стилей Создание дочерних элементов <local:MyCopm/> var comp:MyComp = new MyCopm(); comp.setStyle(“…”, “…”); public function MyCopm { super(); addEventListener( MouseEvent.CLICK, clickHandler); } Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора 1
  • 6.
    Конструктор systemManager, stage,root getStyle() ( ждём createChildren()) Повторное выполнение кода Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора <my:CustomBtn/> var btn:CustomBtn = new CustomBtn(); btn.setStyle(“…”, “…”); public function CustomBtn { super(); addEventListener( MouseEvent.CLICK, clickHandler); } 1
  • 7.
    get/set методыВыполняются до инициализации Максимально быстрые! Использовать валидацию Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора var foo:Array = [“Hello”, “World!”]; public function set data(val:Array):void{ _data = val; dataChanged = true; invalidateProperties(); } 1
  • 8.
  • 9.
    Создание Конфигурация ПрисоединениеИнициализация Инвалидация Взаимодействие Удаление Сборка мусора parentComponent.addChild(instance); 2 addChild() / addChildAt() initialize() Вызов вручную для не визуальных компонентов
  • 10.
    Фазы инициализации 1.Событие “preinitialize” 2. createChildren() initialize() Дети Родители 4. Валидация Событие “creationComplete” Committed Measured Updated Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора 2
  • 11.
    createChildren() Переопределение Перманентныхподкомпоненты «Создание – Конфигурация – Присоединение» super.createChildren() Динамику отложим до валидации! Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора 2
  • 12.
    Пример переопределения protectedvar closeButon:UIComponent; override protected function createChildren():void{ if (!closeButton){ closButton = new Button(); Button(closeButton).label = “x”; } addChild(closeButton); closeButton.addEventListener( MouseEvent.CLICK, clickHandler); super.createChildren(); } Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора 2
  • 13.
    Отложенная валидация Отложитьобработку изменений Сохранить высокую производительность Функции инвалидации invalidateProperties() invalidateSize() invalidateDisplayList() Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора 2
  • 14.
    Валидация: роль LayoutManager Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора 2 LayoutManager invalidatePropertiesQueue invalidateSizeQueue invalidateDisplayListQueue validateProperties() validateSize() validateDisplayList()
  • 15.
    commitProperties() Обработка динамическихданных Используем флаги! Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора 2 invalidateProperties() validateProperties() commitProperties()
  • 16.
    Пример commitProperties()public function set historyManagementEnabled(value:Boolean) : void{ if (value != _historyManagementEnabled){ _historyManagementEnabled = value ; historyManagementEnabledChanged = true; invalidateProperties(); } } Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора 2
  • 17.
    measure() Предпочтительный размерmeasuredWidth / measuredHeight measuredMinWidth / measureMinHeight Вызывается автоматически Не вызывается при explicitWidth / explicitHeight Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора 2 invalidateSize() validateSize() masure()
  • 18.
    Пример measure()override protected function measure():void { for (var i:int = 0; i < numChildren; ++i){ var child:UIComponent = UIComponent(getChildAt()) measuredHeight += child.getExplicitOrMeasuredHeight() + VERTICAL_GAP; } measuredMinWidth = 10; measuredMinHeight = measuredHeight; } Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора 2
  • 19.
    updateDisplayList() Дочерние елементыПозиционирование размер Drawing API Актуальный размер выставляется здесь! Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора 2 invalidateDisplayList() validateDisplayList() updateDisplayList()
  • 20.
    Пример updateDisplayList()override protected function updateDisplayList():void{ … item.data = data; UIComponentGlobals.layoutManager.validateClient( item, true); var w:Number = item.getExplicitOrMeasuredWidth(); item.setActualSize(w, h); item.move(x, y); } Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора 2
  • 21.
    Размеры Measured (measuredWidth)Предпочтительный размер Вычисляется measure() Explicit (explicitWidth) Присваивается пользователем <mx:Button width=“100”/> Percentage (percentWidth) Присваивается пользователем Вычисляется родителем <mx:Button width=“100%”/> Actual setActualSize() Присваивается в updateDisplayList() родителем Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора 2
  • 22.
  • 23.
    Отдельная тема СозданиеКонфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора 3
  • 24.
  • 25.
    Уборка Методы удаленияremoveChild() removeChildAt() removeAllChildren() visible=false для постоянных элементов Сборщик мусора Ссылки на объект Обработчики событий binding Dictionary Создание Конфигурация Присоединение Инициализация Инвалидация Взаимодействие Удаление Сборка мусора 4
  • 26.
    Сравнение цикла MX(AS2) и Flex destroyObject(id:String) removeChild invalidateSize invalidateDisplayList redraw commitProperties redraw measure draw / size updateDisplayList invalidate invalidateProperties removeChildAt createChildren createChildren init initialize createObject / createClassObject addChild/addChildAt
  • 27.
    Вопросы? Павел Кожин[email_address] Exigen Services