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