flash - 本地定时器对象事件处理程序

标签 flash apache-flex actionscript-3

我在类函数中有以下代码:

public function foo():void
{
    var timer:Timer = new Timer(10000,1);
    timer.addEventListener(TimerEvent.TIMER_COMPLETE,onTimerComplete);
    timer.start();
}

public function onTimerComplete(e:TimerEvent):void
{
  // do stuff
}

上面的代码大部分时间都可以工作,但我担心的是如果计时器被垃圾收集会发生什么?是否有可能 onTimerComplete 永远不会触发,因为没有其他对计时器的引用?

我知道 timer 有一个内部处理程序列表,但这不会阻止它被 GC 处理。

最佳答案

网上有一些关于运行计时器从不被垃圾收集的引用资料,e.g. :

Just to be clear: even if you have no references to a Timer, as long as the timer is running, it will not be Garbage Collected (think of it as if the runtime was keeping a reference to running timers).

by Arno Gourdol on the Adobe AIR Team


但我一直无法找到权威来源。
可能最好不要依赖这种特殊行为,而是让 timer一个类级别的变量,虽然。
建议事件监听器阻止计时器被垃圾收集的答案是不正确的。引用是从计时器到监听器函数 ( onTimerComplete ),因此如果计时器可访问,则监听器函数不会被垃圾收集,反之亦然。这很容易测试:
<?xml version="1.0" encoding="utf-8"?>
<s:Application
xmlns:s="library://ns.adobe.com/flex/spark"
creationComplete="application1_creationCompleteHandler(event)">

<fx:Script>
    <![CDATA[
private var _gcTimer:Timer;

protected function application1_creationCompleteHandler(event:FlexEvent):void {
    var timer:Timer = new Timer(30, 4);
    timer.addEventListener(TimerEvent.TIMER, onTimer, false, 0, true);
    
    var sprite:Sprite = new Sprite();
    sprite.addEventListener(Event.ENTER_FRAME, onSprite, false, 0, true);
    
    _gcTimer = new Timer(59, 1);
    _gcTimer.addEventListener(TimerEvent.TIMER, garbageCollect);

    timer.start();
    _gcTimer.start();
}

private function onTimer(event:TimerEvent):void {
    trace("timer");
}

private function onSprite(event:Event):void {
    trace("sprite");
}
]]>
</fx:Script>
</s:Application>
输出:

sprite
timer
sprite
timer
Collecting garbage
timer
timer

关于flash - 本地定时器对象事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5891354/

相关文章:

javascript - Flex 和不同浏览器的屏幕底部相对定位问题

flash - 如何在AS2中无延迟地转移音轨

java - 在服务器上创建图表并从客户端访问它是糟糕的设计吗?

javascript - 闪存 CS4 错误 1084 : Expecting Identifier before Var

c++ - 如何将 AS3 ByteArray 转换为 wchar_t const* 文件名? (土坯炼金术)

flash - 如何以不同的速度流畅地播放 FLV?

javascript - 寻找 Wii 兼容的 Javascript Flash mp3 播放器

apache-flex - 通过 MXML 扩展 MXML 自定义组件

ios - 如何通过代码退出(或暂停)Flex 4.5 iPhone 应用程序?

flash - (as3) URLloader 保持连接活跃