“只有事件發送者才能偵聽事件”,這句話的意思是dispatchEvent對象與addEventListener對象都必須是同一個實例,所發送的事件類型可以是系統自定義的事件也可以是任一類的靜態常量。
在自定義事件派發與偵聽過程中需要注意事件的流程,我們先要做的是建立偵聽器(addEventListener),再發送事件,程序在執行dispatchEvent之後立馬通知已註冊事件偵聽的所有對象,如果addEventListener語句在dispatchEvent之後,那麼註冊該偵聽器的對象將無法接到通知。這一點在接收和發送數據時容易出問題,有時候很難弄明白dispatchEvent語句究竟是在什麼時候執行的。
Settings.getInstance().loadSettings("customAs/xml/file.xml");
Settings.getInstance().addEventListener(Settings.INIT, onSettingsInit);
public function loadSettings(url:String):void {
var urlRequest:URLRequest = new URLRequest(url);
urlLoader = new URLLoader();
urlLoader.addEventListener(Event.COMPLETE, onXMLDataLoaded);
urlLoader.load(urlRequest);
trace("loadSettings");
}
private function onXMLDataLoaded(event:Event):void {
data = XML(urlLoader.data);
dispatchEvent(new Event(Settings.INIT, true, true));
dispatchEvent(new Event(Settings.FILE,true,true));
}
那麼它執行的順序就應該是先執行loadSettings("customAs/xml/file.xml"),進入loadSettings([url=String):void]url:String):void[/url] 函數,當執行到
urlLoader.addEventListener(Event.COMPLETE, onXMLDataLoaded)的時候,程序只是將urlLoader對象添加到偵聽隊列中,並沒跳轉去執行
onXMLDataLoaded(event:Event):void ,所以這個時候dispatchEvent(new Event(Settings.INIT, true, true))該條語句並未執行,也就是說Settings事件源並未派發事件。
執行完loadSettings([url=String):void]url:String):void[/url] 函數後,再執行
Settings.getInstance().addEventListener(Settings.INIT, onSettingsInit)語句,將Settings.getInstance()添加到Settings事件源的隊列上,當customAs/xml/file.xm加載完後,Event事件源通知urlLoader對象執行onXMLDataLoaded函數,這之後纔會派發 Settings.INIT事件,之後執行onSettingsInit函數
http://blog.csdn.net/lingwen20/archive/2009/08/21/4470510.aspx