Flex事件侦听器回调未触发

时间:2011-06-17 15:35:22

标签: flex events flex4 callback

也许你可以帮我指出正确的方向。在我们的应用程序中,我定期注意到特定事件处理程序未触发。 99%的时间,它工作正常,但是,每隔一段时间,它就会死亡。我怎么能知道发生了什么? DispatchEvent()是不是以某种方式发生/工作?我的听众还在听吗?是否有其他东西能够捕获事件,而不是传递它以便“正确”的倾听者可以接触到它?

这里有一些代码...... code

这是一个有点修剪过的版本,真正的代码是什么,但我认为我没有删除任何重要的东西。关键,正如我所看到的那样,我们启动params对话框,然后开始侦听已关闭的事件。然后,我们展示了param对话框的关闭功能。失败时会发生什么,因为永远不会生成跟踪消息“catch close event ..”,因此,根本不会调用closeHandler。

我没有看到任何不合适的地方,是吗?

那么,我可以使用哪些工具来跟踪这个小故障呢?

谢谢!

1 个答案:

答案 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);