ネイティブ実装は、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 のサブクラスなので、このクラスもイベントを送出できます。この例では、
type
プロパティを
"scanCompleted"
に設定して Event オブジェクトを送出します。このイベントに関連するすべての 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; }
}
|
|
|