2011年1月14日 星期五

深入FLEX組件生命週期

深入FLEX組件生命週期

關鍵字: 深入flex組件生命週期
1、生命週期(LifeCycle)簡述
⑴調用組件構造函數。構造函數沒有返回類型,沒有參數,使用super()調用父類的構造器
⑵使用set,get設置組件屬性,常在set方法內監控一個布爾變量來實現失效機制
⑶調用addChild()方法將組件添加到父組件顯示列表中,FLEX將自動調用createChildren()invalidateProperties()invalidateSize()invalidateDisplayList()。只有將組件添加到父容器中,FLEX才能確定它的大小(size),設置它所繼承樣式(style)屬性,或者在屏幕上畫出它
⑷組件的parent 屬性設置為對父容器的引用
⑸樣式(style)設置
組件分發preinitialize事件
調用組件createChildren()方法
調用 invalidateProperties()invalidateSize()invalidateDisplayList()失效方法,FLEX將在下一個「渲染事件」(render event)期間對相應的commitProperties()measure() updateDisplayList()方法進行調用。這個規則唯一例外就是當用戶設置組件的height width 屬性時, Flex 不會調用measure()方法。也就是說,只有當組件的explicitWidth explicitHeight 屬性是NaN Flex才會調用measure()方法。
組件分發initialize事件。此時組件所有的子組件初始化完成,但組件尚未更改size和佈局,可以利用這個事件在組件佈局之前執行一些附加的處理
在父容器上分發childAdd事件
在父容器上分發initialize事件
在下一個「渲染事件」(render event), Flex 執行以下動作:
a.調用組件的commitProperties()方法
b.調用組件的measure()方法
c.調用組件的layoutChrome()方法
d.調用組件的updateDisplayList()方法
e.在組件上分發updateComplete事件
如果commitProperties() measure()updateDisplayList()方法調用了invalidateProperties()invalidateSize()invalidateDisplayList()方法,則Flexh 會分發另外一個render事件
在最後的render事件發生後, Flex執行以下動作:
a.設置組件visible屬性使其可視
b.組件分發creationComplete事件,組件的大小(size)和佈局被確定,這個事件只在組件創建時分發一次
c.組件分發updateComplete事件。無論什麼時候,只要組件的佈局(layout),位置,大小或其它可視的屬性發生變化就會分發這事件,然後更新組件來正確地顯示。
2、為什麼使用失效機制(invalidation mechanism)
一種情況是,當設置了組件的多個屬性後,比如Button 控件的label icon 屬性,我們需要所有屬性被設置後一次性執行commitProperties(), measure(), updateDisplayList()方法,而不是設置過label 屬性後執行一遍這些方法,然後在設置icon屬性後又執行一次這些方法。
另一種情況是幾個組件同時更改了它們的字體大小。程序更改字體大小的執行速度大大快於Flex 更新應用的速度,因此要在確定最終更改字體之後才開始更新佈局。另外,Flex 需要協調佈局操作以消除任何冗餘過程,而不是在每個組件更新它的字體大小之後都執行一次佈局操作。
Flex 使用「失效機制(invalidation mechanism)」來同步組件的更改。Flex 用一系列方法的調用,比如在setter方法內監控一個變更變量來標記組件的某些東西已經發生變化, 然後在下一個「渲染事件(renderevent)」中觸發組件的commitProperties(), measure(), layoutChrome()updateDisplayList()檢查這些布爾變量來完成最終的變更邏輯。這樣做的額外好處就是setter方法可以更迅速地返回,把對新屬性值的處理留給了commitProperties()方法。
失效方法及其對應的觸發函數如下:
invalidateProperties() 通知組件,以使下次屏幕更新時,它的commitProperties()方法被調用。
invalidateSize() 通知組件,以使下次屏幕更新時,它的measure()方法被調用。
invalidateDisplayList() 通知組件,以使下次屏幕更新時它的layoutChrome()方法和
updateDisplayList()方法能被調用。
當組件調用一個「失效」方法時,它就通知Flex該組件已經被更新。當多個組件調用失效
方法,Flex 會在schedules中協調這些更新,以使這些更新操作在下一次屏幕更新時一起執行。注意,createChildren()沒有對應的失效方法,它會在調用後被立即執行。

原文出處:http://pzmayf.javaeye.com/blog/418835

沒有留言:

張貼留言