侦听事件

本机实现可以调度 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;    } 
    }