44
Adobe Flex 3 Component Lifecycle Presented by Ethan Du( 杜增强)

杜增强-Flex3组件生命周期

Embed Size (px)

DESCRIPTION

杜增强-Flex3组件生命周期

Citation preview

Page 1: 杜增强-Flex3组件生命周期

Adobe Flex 3 Component Lifecycle

Presented by Ethan Du(杜增强)

Page 2: 杜增强-Flex3组件生命周期

Who am I ?

Ethan Du– Senior Flex Architect @ 123Show

– blog: http://www.duzengqiang.com

Page 3: 杜增强-Flex3组件生命周期

Flex

  What is Flex?• MXML• A set of components• The component lifecycle!

Page 4: 杜增强-Flex3组件生命周期

Flex Component Lifecycle

  What is it?• The way the framework interacts with every Flex component• A set of methods the framework calls to instantiate, control, and destroy components

Page 5: 杜增强-Flex3组件生命周期

Phases of the Lifecycle

  3 Main Phases:  BIRTH:

• construction, configuration,attachment, initialization

  LIFE: • invalidation, validation, interaction

  DEATH: • detachment, garbage collection

Page 6: 杜增强-Flex3组件生命周期

Birth

Page 7: 杜增强-Flex3组件生命周期

Construction

Page 8: 杜增强-Flex3组件生命周期

What is a constructor?

  A function called to instantiate (create in memory) a new instance of a class

Page 9: 杜增强-Flex3组件生命周期

How is a constructor invoked?

Actionscript:var theLabel : Label = new Label();

MXML:<mx:Label id="theLabel"/>

Page 10: 杜增强-Flex3组件生命周期

What does an ActionScript3 constructor look like?

public function ComponentName(){

super();//blah blah blah

}  No required arguments (if it will be used in MXML); zero, or all optional  Only one per class (no overloading!)  No return type  Must be public  Call super()…or the compiler will do it for you.

Page 11: 杜增强-Flex3组件生命周期

What should a constructor do?

  A good place to add event listeners to the object.

  Not much. Since the component’s children have not yet been created, there’s not much that can be done.

Page 12: 杜增强-Flex3组件生命周期

Don’t create or add children in the constructor

  It’s best to delay the cost of createChildrencalls for added children until it’s necessary

Page 13: 杜增强-Flex3组件生命周期

Configuration

Page 14: 杜增强-Flex3组件生命周期

Configuration

  The process of assigning values to properties on objects  In MXML, properties are assigned in this phase, before components are attached or initialized<local:SampleChild property1="value"/>

Page 15: 杜增强-Flex3组件生命周期

Configuration Optimization

  To avoid performance bottlenecks, make your setters fast and defer any real work until validation  We’ll talk more about deferment in the validation / invalidation section

Page 16: 杜增强-Flex3组件生命周期

Attachment

Page 17: 杜增强-Flex3组件生命周期

What is attachment?

  Adding a component to the display list (addChild, addChildAt, MXML declaration)

Page 18: 杜增强-Flex3组件生命周期

addingChild(child);

$addChildAt(child, index);

childAdded(child);

Methods

Page 19: 杜增强-Flex3组件生命周期

Must know about attachment

  The component lifecycle is stalled after configuration until attachment occurs.

Page 20: 杜增强-Flex3组件生命周期

Consider this component:public class A extends UIComponent{

public function A() { trace( "CONSTRUCTOR" ); super();

}

override protected function createChildren() : void { trace( "CREATECHILDREN" ); super.createChildren();

}

override protected function measure() : void { trace( "MEASURE" ); super.measure();

}

override protected function updateDisplayList(width:Number, height:Number) : void { trace( "UPDATEDISPLAYLIST" ); super.updateDisplayList(width,height);

}

override protected function commitProperties():void { trace( "COMMITPROPERTIES" ); super.commitProperties();

}

(It traces all of its methods.)

Page 21: 杜增强-Flex3组件生命周期

And this application:<mx:Application ...>

<mx:Script> <![CDATA[

override protected function createChildren() : void {

super.createChildren(); var a : A = new A();

} ]]>

</mx:Script></mx:Application>

Page 22: 杜增强-Flex3组件生命周期

Output:CONSTRUCTOR

  Without attachment, the rest of the lifecycle doesn’t happen.

Page 23: 杜增强-Flex3组件生命周期

But what about this application?<mx:Application ...>

<mx:Script> <![CDATA[

override protected function createChildren() : void {

super.createChildren(); var a : A = new A();

this.addChild( a ); }

]]> </mx:Script>

</mx:Application>

Page 24: 杜增强-Flex3组件生命周期

Output: CONSTRUCTORCREATECHILDRENCOMMITPROPERTIESMEASUREUPDATEDISPLAYLIST

Don’t add components to the stage until you need them.

Page 25: 杜增强-Flex3组件生命周期

Initialization

Page 26: 杜增强-Flex3组件生命周期

Initialization

1. ‘preInitialize’ dispatched2. createChildren(); called3. ‘initialize’ dispatched4. first validation pass occurs5. ‘creationComplete’ dispatched – component

is fully commited, measured, and updated.

Page 27: 杜增强-Flex3组件生命周期

createChildren()  MXML uses the createChildren() method to add children to

containers  Override this method to add children using AS

• Follow MXML’s creation strategy: create, configure, attach

override protected function createChildren():void{...textField = new UITextField();

textField.enabled = enabled;textField.ignorePadding = true;textField.addEventListener("textFieldStyleChange", textField_textFieldStyleChangeHandler); ... ... addChild(DisplayObject(textField));}

Page 28: 杜增强-Flex3组件生命周期

3 Important Rules

1. Containers must contain only UIComponents2. UIComponents must go inside other

UIComponents.3. UIComponents can contain anything (Sprites,

Shapes, MovieClips, Video, etc).

Page 29: 杜增强-Flex3组件生命周期

Life

Page 30: 杜增强-Flex3组件生命周期

Invalidation / Validation cycle  Flex imposes deferred validation on the Flash API

• goal: defer screen updates until all properties have been set

  3 main method pairs to be aware of: • invalidateProperties() ->

commitProperties()• invalidateSize() -> measure()• invalidateDisplayList() -> updateDisplayList()

Page 31: 杜增强-Flex3组件生命周期

Deferment

  Deferment is the central concept to understand in the component Life-cycle  Use private variables and boolean flags to defer setting any render-related properties until

the proper validation method

Page 32: 杜增强-Flex3组件生命周期

bad example

public function set text(value:String):void{ myLabel.text = value;

}

Page 33: 杜增强-Flex3组件生命周期

good example

private var _text:String = "";private var textChanged:Boolean = false; public function set text(value:String):void{ _text = value; textChanged = true; invalidateProperties(); invalidateSize(); invalidateDisplayList();}

override protected function commitProperties():void{{

if(textChanged){myLabel.text = _text;textChanged = false;

}super.commitProperties();

}

Page 34: 杜增强-Flex3组件生命周期

Interaction

Page 35: 杜增强-Flex3组件生命周期

Interaction

  Flex is an Event Driven Interaction Model.

Page 36: 杜增强-Flex3组件生命周期

Death

Page 37: 杜增强-Flex3组件生命周期

Detachment

Page 38: 杜增强-Flex3组件生命周期

Detachment  “Detachment” refers to the process of removing a child from the display list  These children can be re-parented (brought back to life) or abandoned to die  Abandoned components don’t get validation calls and aren’t drawn  If an abandoned component has no more active references, it *should* be garbage-collected

Page 39: 杜增强-Flex3组件生命周期

Garbage Collection

Page 40: 杜增强-Flex3组件生命周期

Garbage Collection

  The process by which memory is returned to the system  Only objects with no remaining references to them will be gc’d• Set references to detached children to “null” to mark them for GC  Consider using weak references on event listeners

Page 41: 杜增强-Flex3组件生命周期

Conclusion

  Defer, Defer, DEFER!  Use validation methods correctly

Page 42: 杜增强-Flex3组件生命周期

Conclusion

  Defer, Defer, DEFER!  Use validation methods correctly

Page 43: 杜增强-Flex3组件生命周期

References

  Ely Greenfield: “Building a Flex Component”•http://www.onflex.org/ACDS/BuildingAFlexComponent.pdf

  RJ Owen: “Flex 3 Component Life-cycle”•http://rjria.blogspot.com/2009/04/cf-united-express-denver-presentation.html

  Mrinal Wadhwa: “Flex 4 Component Lifecycle”•http://weblog.mrinalwadhwa.com/2009/06/21/flex-4-component-lifecycle/

Page 44: 杜增强-Flex3组件生命周期

QA