Flex 事件流

Flex是響應RIA(富客戶網絡應用)而出現的,FLEX試圖通過提供一個程序員們已經熟知的工作流和編程模型,讓程序員比從前更快更簡單地開發動畫及RIA應用。在多層式開發模型中,FLEX應用屬於表現層。FLEX的語言和文件結構也試圖把應用程序的邏輯從設計中分離出來。

Flex最重要的兩項技術是ActionScript和MXML,其中ActionScript到現在已經發展成了一門功能強大的面嚮對象語言,目前常用的是ActionScript 3;而MXML是一個可以讓你在Adobe Flex中佈局用戶界面組件的一種XML語言, 描述了反映內容與功能的用戶界面,通過MXML,編程人員無需對Flash有太多的瞭解就可以開發出用戶體驗很好的flash應用。

 

Flex中的事件機制

安裝Flex builder

用戶首先需要到Adobe公司的Flex網站下載http://www.adobe.com/products/flex/,Flex Builder是收費的,但我們可以下載其中的試用版本,Flex Builder的現行版本爲Flex Builder3。

安裝Flex Builder可有好幾種方式,第一種:直接安裝Flex Builder到目標目錄下即可使用;

第二種:將Flex Builder作爲eclipse插件安裝到用戶的eclipse安裝目錄下,然後將Flex Builder目錄下features和plugins中的文件全數拷貝eclipse的相應目錄下,若我們需要藉助MyEclipse來開發Flex應用(確實有這樣的需要,以後會講到),則需要往MyEclipse下的features和plugins目錄進行同樣的拷貝操作。

事件機制

Flex事件中的基本概念

event objects(事件對象):所有的事件對象都是flash.events.Event或者其子類。比如說鼠標事件MouseEvent,計時器事件TimerEvent。每個事件對象中都包括事件類型(type)和事件源(target),便於event listener知道該事件的類型以及是誰拋出這樣的事件。簡單的理解,事件對象就是ActionScript中的各種事件類型的對象。
    event dispatchers(事件源):是事件發起的主體。所有的dispatcher都是EventDispatcher或其子類。事件觸發源必須提供API讓listener進行對該事件的註冊(register)。簡單的理解,事件源就是一個控件。
    event listeners(事件監聽器):在AS 3.0中它往往表現爲一個函數。我們必須爲每個特殊的事件和事件源註冊一個監聽器,當事件發生的時候,事件源(dispatcher)會通知該監聽器去處理制定的事件。簡單的理解,監聽器就是一個函數。

註冊監聽器

在AS 3.0中可以通過下面的語法格式進行註冊。

dispatcher.addEventListener(eventName, listener);

當然在Flex中還有另外一種格式,在mxml文件中對一個控件的事件直接制定一個處理函數,如

<mx:Button label="TestClick" click="clickHandler()"/>

事件階段

我們把事件觸發源分爲兩類:一類是那些顯示在界面中的元素拋出的事件,一類是那些不在界面中顯示的元素拋出的事件。很簡單,舉個例子:第一類如URLLoader對象去load圖片或其他資源所拋出的如complete事件,就屬於第一類。界面上的一個按鈕所拋出的click事件就是第二類,它會觸發一個事件流,引發一系列的事件,它又分三個階段:捕獲(capture),執行(target) 和冒泡(bubble),姑且這樣表達這三個階段。

捕獲階段(capture)

在這個階段,Flash Player會去查找事件的觸發源,它是通過根顯示元素(root display object)逐層向下尋蹤,直到找到事件的發起源頭,如你在button上click後,Flash Player找到的事該button對象。在這個階段監視器(listener)默認是不會收到任何消息的(默認只在target和bubble階段收到消息)。

如果你想在捕獲階段讓listener收到消息並有所動作,那麼你可以在註冊的時候改變第三個參數爲true,如下面的方法:object.addEventListener(MouseEvent.CLICK, onClick, true);

該階段聽起來很陌生,事實上它很少使用。但它卻在事件流中扮演很重要的角色。它可以在事件到達子元素(child elements)之前被application捕獲,當然也就可以阻 止事件到達子元素。

目標執行階段(target)

在這個階段是事件的執行階段,也就是我們常用的用來處理事件流的代碼。

冒泡階段(bubble)

最後的這個階段其實就是第一個階段的逆向過程。它就是在事件代碼執行完畢後通過子元素逐級向父元素髮出該事件,一直到根元素。在這個階段你不需要特別的爲監聽器指定什麼,你只要正常的註冊事件就可以了。監聽器會在該階段收到通知。但前提是該事件是能夠bubble的。

垃圾回收

Flash Player是通過引用計數器(reference counting)以及標記與清除(mark and sweep)來實現垃圾回收的。

引用計數器簡單的講就是給每個對象分配的技術器,一旦該對象的計數器爲0時,就表示該對象可能不再被使用,可以安全的清除了。它的弊端就是不能解決循環引用問題,一旦出現循環引用,就不能通過該方法進行垃圾回收。

而標記與清除(mark and sweep)就是爲了解決循環引用問題的。它是通過在程序中遍歷每個活動的、可到達的節點,一旦發現一些節點是處在活動節點之外的,就被認爲不再有用,就可以被回收了。

這兩種機制是聯合運行在垃圾回收過程中來保證正確回收資源。但他們並不能回收程序錯誤導致的垃圾。而監聽器的註冊就最容易導致這個問題的發生。


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/michaelove/archive/2009/08/18/4454919.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章