イベントの監視

ネイティブ実装は、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;    } 
    }