从ANE(Air Native Extension)调度和处理事件到flex移动应用程序

时间:2013-04-25 12:04:28

标签: flex

我的问题的解释需要一些背景信息让问题有点长,所以请耐心等待。

ANE(Air Native Extension)由3部分组成,本机代码允许您使用设备特定功能(我使用的是android),actionscript库访问这些本机代码功能并使它们可用于Flex移动应用程序和Flex移动应用程序。

对于我的ANE,我正在从广播接收器扩展的onReceive()方法中获取互联网信息。现在该方法没有返回任何内容,所以当它完成后,我将它存储在一个全局变量中并发送一个事件,说明信息已准备就绪。

actionscript接口侦听此事件,当它接收到它时,它会更新一个全局变量,然后调度一个事件,告诉flex移动应用程序信息已准备就绪。

因此,当flex移动应用程序获知所需的信息已准备就绪时,它会进入并获取它。

如果解释不够清楚,这里是我编码的例子:

NATIVE CODE:
public MyClass(AnotherClass v,FREContext c){
    this.v = v;
    this.c = c;       //Will use c to dispatch event
}
onReceive(){
    ....code....
    String x = "internet info"
    AnotherClass.setGlobalVar(x);
    c.dispatchStatusEventAsync("status", "internetInfoReady");
}


ACTIONSCRIPT INTERFACE CODE:
private var context:ExtensionContext;
var info:String;
public function Interface(){
    context = ExtensionContext.createExtensionContext("id",null);
    context.addEventListener(StatusEvent.STATUS,onStatus);
}

public function scan():void{
    //calls function that runs asynchronously to get internet info
}
public function onStatus(event:StatusEvent):void{
    if((event.level == "status") && (event.code="internetInfoReady")){
        info=String(context.all("getInfo"));  //function that retrieves value x in AnotherClass and returns it
        dispatchEvent(new Event("internetInfoReady"));
    }

}

public function getInfo():String{
    return info;
}


FLEX MOBILE APP CODE:
<s:View ....
<fx:Script>
    <![CDATA[
        var a:Interface = new Interface();

        protected function getInfo(event:MouseEvent):void{
            a.scan();
            test.addEventListener("internetInfoReady",onGetInfo);
        }

        protected function onGetInfo(evt:Event):void{
            var info:String = "";
            if(evt.type == "internetInfoReady"){
                info = a.getInfo();
                a.toast(info);  //function that calls android built in toast commands
            }
        }
    ]]>
</fx:Script>

<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<s:Button left="251" right="250" top="40" height="43" label="Get Info" click="getInfo(event)"
          fontFamily="Arial" horizontalCenter="0"/>

应用程序未在我的设备上运行,我只是想确保我正确地调度事件。我创建了一个Android应用程序,它使用已编写的本机代码来显示屏幕上显示的信息,这样我就可以确保该部分有效,而且确实如此,我知道这不是问题所在。

1 个答案:

答案 0 :(得分:0)

您的as3接口类必须 extends EventDispatcher

我注意到扩展项目中自定义事件的一个奇怪的事情

dispatchEvent(new CustomEvent(CustomEvent.CONSTANT, someData));

不会触发事件,但

var ce:CustomEvent = new CustomEvent(CustomEvent.CONSTANT);
    ce.data = someData;
    dispatchEvent(ce);

工作正常