侦听事件

本机实现可以调度 ActionScript 扩展代码能够侦听的事件。通过这种机制,本机实现可以异步执行任务,并在任务完成时通知 ActionScript 端。

事件目标是 ExtensionContext 实例。因此,使用 ExtensionContext 实例的 addEventListener() 方法可以订阅来自本机实现的事件。

以下示例向 TVChannelController 添加相应的代码,用于接收来自本机实现的事件。使用扩展的应用程序调用 ActionScript 扩展类方法 scanChannels() ,而该方法又调用本机函数 "scanDeviceChannels"

该本机函数异步扫描所有可用频道。扫描完成后,该函数调度一个事件。 onStatus() 方法通过查询本机方法 "getDeviceChannels" 来处理该事件,从而获取频道列表。 onStatus() 方法将列表存储在 scannedChannelList 数据成员中,并向应用程序的侦听对象调度一个事件。当应用程序对象收到该事件时,即可调用 ActionScript 扩展类属性存取器 availableChannels

package  com.example { 
     public  class TVChannelController extends EventDispatcher {  
 
        private var extContext:ExtensionContext;  
        private var channel:int;  
        private var scannedChannelList:Vector.<int>; 
 
        public function TVChannelController() { 
            extContext = ExtensionContext.createExtensionContext( 
                            "com.example.TVControllerExtension", "channel"); 
            extContext.addEventListener(StatusEvent.STATUS, onStatus); 
        } 
        . 
        . 
        . 
        public function scanChannels():void { 
            extContext.call("scanDeviceChannels"); 
        } 
        public function get availableChannels():Vector.<int> { 
            return scannedChannelList; 
        } 
        private function onStatus(event:StatusEvent):void { 
            if ((event.level == "status") && (event.code == "scanCompleted")) { 
                scannedChannelList = (Vector.<int>)(extContext.call("getDeviceChannels")); 
                dispatchEvent (new Event ("scanCompleted") ); 
            }     
        } 
    } 
}

该示例阐释了以下几点:

  • 本机实现只能调度 StatusEvent 对象。因此, addEventListener() 方法侦听事件类型 StatusEvent.STATUS

  • 本机实现设置 StatusEvent 对象的 code level 属性。您可以定义要为这些属性使用的字符串。在本示例中,本机实现将 level 属性设置为“ status" 并将 code 属性设置为 "scanCompleted" 。通常,StatusEvent 的 level 属性的值为 "status" "info" "error"

  • 由于 TVChannelController 是 EventDispatcher 的子类,因此它也可以调度一个事件。在本示例中,它调度一个 Event 对象,并将该对象的 type 属性设置为 "scanCompleted" 。任何关注该事件的 ActionScript 对象均可侦听该事件。例如,以下代码显示了使用此扩展的 AIR 应用程序的一个代码片段。该应用程序创建 TVChannelController 对象。然后,它要求 TVChannelController 对象扫描频道。最后等待扫描完成。

    var channelController:TVChannelController = new TVChannelController(); 
    channelController.addEventListener("scanCompleted", onChannelsScanned); 
    channelController.scanChannels(); 
    var channelList:Vector.<int>; 
     
    private function onChannelsScanned(evt:Event):void { 
        if (evt.type == "scanCompleted") { 
            channelList = channelController.availableChannels;    } 
    }