如何监听ANE派发的事件?我的Flex应用为何无法接收事件?
问题排查与解决方案
从你的代码来看,原生侧的事件已经成功触发(能看到"dispatching event"提示),但Flex视图收不到事件,主要问题出在事件派发的上下文不匹配,还有几个细节需要调整,逐一分析:
1. 事件派发的目标完全错配
你在ANE的AS3代码里用dispatcher.dispatchEvent(),但这个dispatcher和你Flex视图(MyAppHomeView)根本不在同一个事件流里——视图是给自己加的监听器,而事件是从另一个无关的dispatcher对象发出来的,自然收不到。
修复方案:
让ANE的核心类作为事件派发者,并且让Flex视图监听这个ANE实例的事件:
- 首先把你的
MyANE改成单例模式(确保全局唯一实例):public class MyANE extends EventDispatcher { private static var _instance:MyANE; public static function getInstance():MyANE { if (!_instance) { _instance = new MyANE(); } return _instance; } // 原来的静态onStatus方法改成通过实例派发事件 private static function onStatus(event:StatusEvent):void { if (event.code == MyEvent.EVENT_NAME) { displayToast("dispatching event"); // 从ANE实例派发事件 getInstance().dispatchEvent(new MyEvent(MyEvent.EVENT_NAME)); } } // 其他方法比如showDialogMessage保持不变 public static function showDialogMessage(msg:String):void { // ... 你的原有实现 } } - 然后在Flex视图里,监听ANE实例的事件,而不是视图自身:
protected function createListener():void{ MyANE.showDialogMessage("init"); // 改成监听MyANE实例的事件 MyANE.getInstance().addEventListener(MyEvent.EVENT_NAME, handleEvent); }
2. 自定义MyEvent类未正确实现clone方法
AS3的事件机制要求自定义Event子类必须重写clone()方法,否则事件在派发后无法被正确传递到监听器。检查你的MyEvent类:
正确的MyEvent实现:
public class MyEvent extends Event { public static const EVENT_NAME:String = "myEvent"; public function MyEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false) { super(type, bubbles, cancelable); } // 必须重写这个方法!没有的话事件会无法传递 override public function clone():Event { return new MyEvent(type, bubbles, cancelable); } }
3. 静态函数中的dispatcher引用问题
你的onStatus是静态方法,如果原来的dispatcher是实例变量,静态方法直接访问会导致引用错误(就算是静态变量,全局EventDispatcher也容易出现状态混乱)。上面的单例方案已经解决了这个问题,通过实例来派发事件,避免静态变量的坑。
4. 可选:事件冒泡设置
如果你的视图层级比较深,或者需要让事件向上冒泡到应用顶层,可以在创建MyEvent时把bubbles参数设为true:
getInstance().dispatchEvent(new MyEvent(MyEvent.EVENT_NAME, true));
按照上面的步骤调整后,应该就能正常触发Flex视图里的handleEvent方法了。
内容的提问来源于stack exchange,提问作者Moody
相关产品推荐
相关产品推荐

