Flex Component Lifecycle Overview

27
Жизненный цикл компонентов Component Lifecycle Overview Павел Кожин [email protected] Exigen Services

description

Preso about Flex Components Lifecycle (April, 12, 2008, Saint Petersburg, Russia) by Pavel Kozhin.

Transcript of Flex Component Lifecycle Overview

Page 1: Flex Component Lifecycle Overview

Жизненный цикл компонентов

Component Lifecycle Overview

Павел Кожин[email protected]

Exigen Services

Page 2: Flex Component Lifecycle Overview

Что такое жизненный цикл и для чего он нужен

• Создание

• Конфигурация

• Присоединение

• Инициализация

• Инвалидация

• Взаимодействие

• Удаление

• Сборка мусора

• Construction

• Configuration

• Attachment

• Initialization

• Invalidation

• Interaction

• Detachment

• Garbage Collection

Page 3: Flex Component Lifecycle Overview

Единая концепция

УправлениеУправлениеДетализацияДетализация

ПереопределениеПереопределение

createChildren()commitProperties()

measure()updateDisplayList()

createChildren()commitProperties()

measure()updateDisplayList()

Page 4: Flex Component Lifecycle Overview

Фаза 1

Page 5: Flex Component Lifecycle Overview

Инстанциирование

• Подписка на события

• Применение стилей

• Создание дочерних элементов

<local:MyCopm/>

var comp:MyComp = new

MyCopm();

comp.setStyle(“…”, “…”);

public function MyCopm {

super();

addEventListener(

MouseEvent.CLICK,

clickHandler);

}

Создание

Конфигурация

Присоединение

Инициализация

Инвалидация

Взаимодействие

Удаление

Сборка мусора

1

Page 6: Flex Component Lifecycle Overview

Конструктор

• systemManager, stage, root

• getStyle() (ждём createChildren())

• Повторное выполнение кода

Создание

Конфигурация

Присоединение

Инициализация

Инвалидация

Взаимодействие

Удаление

Сборка мусора

<my:CustomBtn/>

var btn:CustomBtn = new

CustomBtn();

btn.setStyle(“…”, “…”);

public function CustomBtn {

super();

addEventListener(

MouseEvent.CLICK,

clickHandler);

}

1

Page 7: Flex Component Lifecycle Overview

get/set методы

• Выполняются до инициализации

• Максимально быстрые!

• Использовать валидацию

Создание

Конфигурация

Присоединение

Инициализация

Инвалидация

Взаимодействие

Удаление

Сборка мусора

var foo:Array = [“Hello”, “World!”];

public function set data(val:Array):void{

_data = val;

dataChanged = true;

invalidateProperties();

}

1

Page 8: Flex Component Lifecycle Overview

Фаза 2

Page 9: Flex Component Lifecycle Overview

Создание

Конфигурация

Присоединение

Инициализация

Инвалидация

Взаимодействие

Удаление

Сборка мусора

parentComponent.addChild(instance);

2

addChild() / addChildAt()addChild() / addChildAt()

initialize()initialize()

Вызов вручную для не визуальных компонентов

Page 10: Flex Component Lifecycle Overview

Фазы инициализации

1. Событие “preinitialize”

2. createChildren()

3. initialize()1. Дети

2. Родители

4. Валидация

5. Событие “creationComplete”1. Committed

2. Measured

3. Updated

Создание

Конфигурация

Присоединение

Инициализация

Инвалидация

Взаимодействие

Удаление

Сборка мусора

2

Page 11: Flex Component Lifecycle Overview

createChildren()Создание

Конфигурация

Присоединение

Инициализация

Инвалидация

Взаимодействие

Удаление

Сборка мусора

2

• Переопределение

• Перманентных подкомпоненты

• «Создание – Конфигурация – Присоединение»

• super.createChildren()

• Динамику отложим до валидации!

Page 12: Flex Component Lifecycle Overview

Пример переопределения

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

Page 13: Flex Component Lifecycle Overview

Отложенная валидация

• Отложить обработку изменений

• Сохранить высокую производительность

• Функции инвалидации– invalidateProperties()– invalidateSize()– invalidateDisplayList()

Создание

Конфигурация

Присоединение

Инициализация

Инвалидация

Взаимодействие

Удаление

Сборка мусора

2

Page 14: Flex Component Lifecycle Overview

Валидация: роль LayoutManagerСоздание

Конфигурация

Присоединение

Инициализация

Инвалидация

Взаимодействие

Удаление

Сборка мусора

2

LayoutManagerLayoutManager

invalidatePropertiesQueue

invalidateSizeQueue

invalidateDisplayListQueue

validateProperties()validateProperties()

validateSize()validateSize()

validateDisplayList()validateDisplayList()

Page 15: Flex Component Lifecycle Overview

commitProperties()

• Обработка динамических данных

• Используем флаги!

Создание

Конфигурация

Присоединение

Инициализация

Инвалидация

Взаимодействие

Удаление

Сборка мусора

2invalidateProperties()invalidateProperties()

validateProperties()validateProperties()

commitProperties()commitProperties()

Page 16: Flex Component Lifecycle Overview

Пример commitProperties()

public function set historyManagementEnabled(value:Boolean):void{

if (value != _historyManagementEnabled){

_historyManagementEnabled = value;

historyManagementEnabledChanged = true;

invalidateProperties();

}

}

Создание

Конфигурация

Присоединение

Инициализация

Инвалидация

Взаимодействие

Удаление

Сборка мусора

2

Page 17: Flex Component Lifecycle Overview

measure()

• Предпочтительный размер

• measuredWidth / measuredHeight

• measuredMinWidth / measureMinHeight

• Вызывается автоматически

• Не вызывается при explicitWidth / explicitHeight

Создание

Конфигурация

Присоединение

Инициализация

Инвалидация

Взаимодействие

Удаление

Сборка мусора

2invalidateSize()invalidateSize()

validateSize()validateSize()

masure()masure()

Page 18: Flex Component Lifecycle Overview

Пример 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

Page 19: Flex Component Lifecycle Overview

updateDisplayList()

• Дочерние елементы

– Позиционирование

– размер

• Drawing API

• Актуальный размер выставляется здесь!

Создание

Конфигурация

Присоединение

Инициализация

Инвалидация

Взаимодействие

Удаление

Сборка мусора

2invalidateDisplayList()invalidateDisplayList()

validateDisplayList()validateDisplayList()

updateDisplayList()updateDisplayList()

Page 20: Flex Component Lifecycle Overview

Пример 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

Page 21: Flex Component Lifecycle Overview

РазмерыСоздание

Конфигурация

Присоединение

Инициализация

Инвалидация

Взаимодействие

Удаление

Сборка мусора

2

• Measured (measuredWidth)• Предпочтительный размер

• Вычисляется measure()

• Explicit (explicitWidth)• Присваивается пользователем

• <mx:Button width=“100”/>

• Percentage (percentWidth)• Присваивается пользователем

• Вычисляется родителем

• <mx:Button width=“100%”/>

• Actual setActualSize()• Присваивается в updateDisplayList() родителем

Page 22: Flex Component Lifecycle Overview

Фаза 3

Page 23: Flex Component Lifecycle Overview

Отдельная темаСоздание

Конфигурация

Присоединение

Инициализация

Инвалидация

Взаимодействие

Удаление

Сборка мусора

3

Page 24: Flex Component Lifecycle Overview

Фаза 4

Page 25: Flex Component Lifecycle Overview

УборкаСоздание

Конфигурация

Присоединение

Инициализация

Инвалидация

Взаимодействие

Удаление

Сборка мусора

• Методы удаления– removeChild()– removeChildAt()– removeAllChildren()

• visible=false для постоянных элементов• Сборщик мусора

– Ссылки на объект• Обработчики событий

• binding

• Dictionary

4

Page 26: Flex Component Lifecycle Overview

Сравнение цикла MX(AS2) и Flex

addChild/addChildAt createObject / createClassObject

initialize init

createChildren createChildren

invalidateProperties

invalidateinvalidateSize

invalidateDisplayList

commitProperties redraw

measure redraw

updateDisplayList draw / size

removeChilddestroyObject(id:String)

removeChildAt

Page 27: Flex Component Lifecycle Overview

Вопросы?

Павел Кожин[email protected]

Exigen Services