深入學(xué)習(xí)Flex組件生命周期
本文向大家簡(jiǎn)單介紹一下Flex組件生命周期,使用set,get設(shè)置Flex組件屬性,常在set方法內(nèi)監(jiān)控一個(gè)布爾變量來(lái)實(shí)現(xiàn)失效機(jī)制。
深入學(xué)習(xí)Flex組件生命周期
1、生命周期(LifeCycle)簡(jiǎn)述
⑴調(diào)用Flex組件構(gòu)造函數(shù)。構(gòu)造函數(shù)沒(méi)有返回類(lèi)型,沒(méi)有參數(shù),使用super()調(diào)用父類(lèi)的構(gòu)造器
⑵使用set,get設(shè)置Flex組件屬性,常在set方法內(nèi)監(jiān)控一個(gè)布爾變量來(lái)實(shí)現(xiàn)失效機(jī)制
⑶調(diào)用addChild()方法將Flex組件添加到父Flex組件顯示列表中,F(xiàn)LEX將自動(dòng)調(diào)用createChildren(),invalidateProperties(),invalidateSize(),invalidateDisplayList()。只有將Flex組件添加到父容器中,F(xiàn)LEX才能確定它的大小(size),設(shè)置它所繼承樣式(style)屬性,或者在屏幕上畫(huà)出它
⑷Flex組件的parent屬性設(shè)置為對(duì)父容器的引用
⑸樣式(style)設(shè)置
⑹Flex組件分發(fā)preinitialize事件
⑺調(diào)用Flex組件createChildren()方法
⑻調(diào)用invalidateProperties(),invalidateSize(),invalidateDisplayList()失效方法,F(xiàn)LEX將在下一個(gè)“渲染事件”(renderevent)期間對(duì)相應(yīng)的commitProperties(),measure(),updateDisplayList()方法進(jìn)行調(diào)用。這個(gè)規(guī)則唯一例外就是當(dāng)用戶(hù)設(shè)置Flex組件的height和width屬性時(shí),Flex不會(huì)調(diào)用measure()方法。也就是說(shuō),只有當(dāng)Flex組件的explicitWidth和explicitHeight屬性是NaN時(shí)Flex才會(huì)調(diào)用measure()方法。
⑼Flex組件分發(fā)initialize事件。此時(shí)Flex組件所有的子Flex組件初始化完成,但Flex組件尚未更改size和布局,可以利用這個(gè)事件在Flex組件布局之前執(zhí)行一些附加的處理
⑽在父容器上分發(fā)childAdd事件
⑾在父容器上分發(fā)initialize事件
⑿在下一個(gè)“渲染事件”(renderevent)中,Flex執(zhí)行以下動(dòng)作:
a.調(diào)用Flex組件的commitProperties()方法
b.調(diào)用Flex組件的measure()方法
c.調(diào)用Flex組件的layoutChrome()方法
d.調(diào)用Flex組件的updateDisplayList()方法
e.在Flex組件上分發(fā)updateComplete事件
⒀如果commitProperties(),measure(),updateDisplayList()方法調(diào)用了invalidateProperties(),invalidateSize(),invalidateDisplayList()方法,則Flexh會(huì)分發(fā)另外一個(gè)render事件
⒁在最后的render事件發(fā)生后,Flex執(zhí)行以下動(dòng)作:
a.設(shè)置Flex組件visible屬性使其可視
b.Flex組件分發(fā)creationComplete事件,F(xiàn)lex組件的大小(size)和布局被確定,這個(gè)事件只在Flex組件創(chuàng)建時(shí)分發(fā)一次
c.Flex組件分發(fā)updateComplete事件。無(wú)論什么時(shí)候,只要Flex組件的布局(layout),位置,大小或其它可視的屬性發(fā)生變化就會(huì)分發(fā)這事件,然后更新Flex組件來(lái)正確地顯示。
2、為什么使用失效機(jī)制(invalidationmechanism)
一種情況是,當(dāng)設(shè)置了Flex組件的多個(gè)屬性后,比如Button控件的label和icon屬性,我們需要所有屬性被設(shè)置后一次性執(zhí)行commitProperties(),measure(),updateDisplayList()方法,而不是設(shè)置過(guò)label屬性后執(zhí)行一遍這些方法,然后在設(shè)置icon屬性后又執(zhí)行一次這些方法。
另一種情況是幾個(gè)Flex組件同時(shí)更改了它們的字體大小。程序更改字體大小的執(zhí)行速度大大快于Flex更新應(yīng)用的速度,因此要在確定最終更改字體之后才開(kāi)始更新布局。另外,F(xiàn)lex需要協(xié)調(diào)布局操作以消除任何冗余過(guò)程,而不是在每個(gè)Flex組件更新它的字體大小之后都執(zhí)行一次布局操作。
Flex使用“失效機(jī)制(invalidationmechanism)”來(lái)同步Flex組件的更改。Flex用一系列方法的調(diào)用,比如在setter方法內(nèi)監(jiān)控一個(gè)變更變量來(lái)標(biāo)記Flex組件的某些東西已經(jīng)發(fā)生變化,然后在下一個(gè)“渲染事件(renderevent)”中觸發(fā)Flex組件的commitProperties(),measure(),layoutChrome(),updateDisplayList()檢查這些布爾變量來(lái)完成最終的變更邏輯。這樣做的額外好處就是setter方法可以更迅速地返回,把對(duì)新屬性值的處理留給了commitProperties()方法。
失效方法及其對(duì)應(yīng)的觸發(fā)函數(shù)如下:
invalidateProperties()通知Flex組件,以使下次屏幕更新時(shí),它的commitProperties()方法被調(diào)用。
invalidateSize()通知Flex組件,以使下次屏幕更新時(shí),它的measure()方法被調(diào)用。
invalidateDisplayList()通知Flex組件,以使下次屏幕更新時(shí)它的layoutChrome()方法和
updateDisplayList()方法能被調(diào)用。
當(dāng)Flex組件調(diào)用一個(gè)“失效”方法時(shí),它就通知Flex該Flex組件已經(jīng)被更新。當(dāng)多個(gè)Flex組件調(diào)用失效
方法,F(xiàn)lex會(huì)在schedules中協(xié)調(diào)這些更新,以使這些更新操作在下一次屏幕更新時(shí)一起執(zhí)行。注意,createChildren()沒(méi)有對(duì)應(yīng)的失效方法,它會(huì)在調(diào)用后被立即執(zhí)行。
【編輯推薦】