Local timer event handler

I have the following code in a class function:

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
}

The above code works most of the time, but I'm worried what happens if the timer receives garbage collection? Is it possible that onTimerComplete will never fire because there are no other timer references?

I know that the timer has an internal list of handlers, but this will not prevent it from being GC'ed.

+5
source share
4 answers

There are several links on the Internet to timers that never collect garbage, for example :

, : , , ( ).

Adobe AIR

.

, 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>

:







+1

, , ?

var antiGarbage:Array = [];
var timer:Timer = new Timer(10000, 1);

antiGarbage[antiGarbage.length] = timer;

, , , , :

timer.removeEventListener(TimerEvent.COMPLETE, onTimerComplete);

GC.

0

, , onTimerComplete , GCed.
- JavaScipt. - , . - , GC GC, , . , .
, , .
, .
.

timer.addEventListener(TimerEvent.COMPLETE,onTimerComplete);

timer.addEventListener(TimerEvent.TIMER_COMPLET,onTimerComplete);


, GCed.

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

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

antiGarbage, , 12 .

AS3 , , . , , - , () -, , ( ) .

If your timer appears in the debugger variables when it should be ticking and ending, then you should be gold.

0
source

All Articles