也许你可以帮我指出正确的方向。在我们的应用程序中,我定期注意到特定事件处理程序未触发。 99%的时间,它工作正常,但是,每隔一段时间,它就会死亡。我怎么能知道发生了什么? DispatchEvent()是不是以某种方式发生/工作?我的听众还在听吗?是否有其他东西能够捕获事件,而不是传递它以便“正确”的倾听者可以接触到它?
这里有一些代码......
这是一个有点修剪过的版本,真正的代码是什么,但我认为我没有删除任何重要的东西。关键,正如我所看到的那样,我们启动params对话框,然后开始侦听已关闭的事件。然后,我们展示了param对话框的关闭功能。失败时会发生什么,因为永远不会生成跟踪消息“catch close event ..”,因此,根本不会调用closeHandler。
我没有看到任何不合适的地方,是吗?
那么,我可以使用哪些工具来跟踪这个小故障呢?
谢谢!
答案 0 :(得分:1)
您正在处理从组件内部移除组件的组件。您在实际删除它之前调度CLOSE事件,但是当对象已被删除时它很可能会到达。这是由于事件的异步性质。这意味着每隔一段时间处理事件的函数就会在事件到来时不再存在。当然,如果你使用弱引用。
<强>溶液强>
现在解决这个问题:
PopUpManager.removePopUp(this)
,因为'this'不是指组件,而是指闭包本身。var closeHandler:function = function(e:CloseEvent):void {
trace("...");
var p:Params = e.currentTarget as Params;
p.removeEventListener(CloseEvent.CLOSE, closeHandler);
/* other code that you want to execute in the closure */
}
var p:Params = PopUpManager.createPopUp(myApp, Params, true) as Params);
p.addEventListener(CloseEvent.CLOSE, closeHandler);
PopUpManager.centerPopUp(p);