Neejoh
%Europe/Berlin %533 %2008, 13:47
Met onderstaande code loopt mijn geheugen van de browser (of player) vrij snel vol. Ik gebruik fullscreen afbeeldingen tussen de 100-400kb en de slideshow draait een gehele dag. Als het geheugen dus een aantal MB per uur oploopt gaat dit voor problemen zorgen.
Onderstaande code is de Document Class van een lege .FLA
slides.as
/**
* Slideshow with memoryleak
* Any help would be much appreciated!
* @email <r.terveen@comsi.nl>
*
* @original Chris Brimelow
* @url http://chrisbrimelow.com/blog/?p=20
*/
package
{
import flash.display.MovieClip;
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.events.*;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.utils.Timer;
import fl.transitions.Tween;
import fl.transitions.easing.*;
public class slides extends MovieClip
{
var xmlLoader:URLLoader;
var theXML:XML;
var durationSlide:uint=2000;//-- miliseconds
var durationFade:Number=1;//-- seconden
var photos:XMLList;
var photoLoader:Loader;
var photoArray:Array;
var fade:Tween;
var curr:Number;
var timer:Timer;
public function slides():void
{
xmlLoader=new URLLoader;
xmlLoader.load(new URLRequest("images.xml"));
xmlLoader.addEventListener(Event.COMPLETE,getXML);
photoArray=new Array;
curr=0;
timer=new Timer(durationSlide);
timer.addEventListener(TimerEvent.TIMER, switchPhoto);
photoLoader = new Loader;
}
private function getXML(e:Event):void
{
theXML=new XML(e.target.data);
photos = new XMLList(theXML.websiteinfo.photos.photo);
for (var i:int=4; i < photos.length(); i++) {
photoArray.push(photos[i].@url);
}
timer.start();
switchPhoto(null);
}
private function switchPhoto(e:TimerEvent):void
{
if (curr < photoArray.length) {
photoLoader.load(new URLRequest(photoArray[curr]));
photoLoader.contentLoaderInfo.addEventListener(Eve nt.COMPLETE,fadeSlide);
trace("loading: " + photoArray[curr]);
curr++;
} else {
curr=0;
switchPhoto(null);
photoLoader.unload();
trace("unloading...");
}
}
private function fadeSlide(e:Event):void
{
stage.addChild(photoLoader);
fade=new Tween(photoLoader,"alpha",Regular.easeOut,0,1,durationFade,true);
}
}
}
XML:
<?xml version="1.0" encoding="utf-8"?>
<mywebsite>
<websiteinfo>
<information>Bla bla bla yada yada.</information>
<photos>
<photo id="1" url="images/mydirectory/Animals.jpg" />
<photo id="2" url="images/mydirectory/animals_up_for_adoption.jpg" />
<photo id="3" url="images/mydirectory/main-eagle.jpg" />
<photo id="4" url="images/mydirectory/funnyanimals.jpg" />
<photo id="5" url="images/mydirectory/giraffe.jpg" />
<photo id="6" url="images/mydirectory/Twins1.JPG" />
</photos>
</websiteinfo>
</mywebsite>
In de constructor vraag ik de XML op, start ik de timer (2000 ms), maak een nieuwe loader container voor de afbeeldingen.
De timer roept de functie switchPhoto() aan, die kijkt of hij alle items uit de XML gehad heeft, is dit het geval leegt hij de container.
Iemand een idee waar het mis gaat?
Onderstaande code is de Document Class van een lege .FLA
slides.as
/**
* Slideshow with memoryleak
* Any help would be much appreciated!
* @email <r.terveen@comsi.nl>
*
* @original Chris Brimelow
* @url http://chrisbrimelow.com/blog/?p=20
*/
package
{
import flash.display.MovieClip;
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.events.*;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.utils.Timer;
import fl.transitions.Tween;
import fl.transitions.easing.*;
public class slides extends MovieClip
{
var xmlLoader:URLLoader;
var theXML:XML;
var durationSlide:uint=2000;//-- miliseconds
var durationFade:Number=1;//-- seconden
var photos:XMLList;
var photoLoader:Loader;
var photoArray:Array;
var fade:Tween;
var curr:Number;
var timer:Timer;
public function slides():void
{
xmlLoader=new URLLoader;
xmlLoader.load(new URLRequest("images.xml"));
xmlLoader.addEventListener(Event.COMPLETE,getXML);
photoArray=new Array;
curr=0;
timer=new Timer(durationSlide);
timer.addEventListener(TimerEvent.TIMER, switchPhoto);
photoLoader = new Loader;
}
private function getXML(e:Event):void
{
theXML=new XML(e.target.data);
photos = new XMLList(theXML.websiteinfo.photos.photo);
for (var i:int=4; i < photos.length(); i++) {
photoArray.push(photos[i].@url);
}
timer.start();
switchPhoto(null);
}
private function switchPhoto(e:TimerEvent):void
{
if (curr < photoArray.length) {
photoLoader.load(new URLRequest(photoArray[curr]));
photoLoader.contentLoaderInfo.addEventListener(Eve nt.COMPLETE,fadeSlide);
trace("loading: " + photoArray[curr]);
curr++;
} else {
curr=0;
switchPhoto(null);
photoLoader.unload();
trace("unloading...");
}
}
private function fadeSlide(e:Event):void
{
stage.addChild(photoLoader);
fade=new Tween(photoLoader,"alpha",Regular.easeOut,0,1,durationFade,true);
}
}
}
XML:
<?xml version="1.0" encoding="utf-8"?>
<mywebsite>
<websiteinfo>
<information>Bla bla bla yada yada.</information>
<photos>
<photo id="1" url="images/mydirectory/Animals.jpg" />
<photo id="2" url="images/mydirectory/animals_up_for_adoption.jpg" />
<photo id="3" url="images/mydirectory/main-eagle.jpg" />
<photo id="4" url="images/mydirectory/funnyanimals.jpg" />
<photo id="5" url="images/mydirectory/giraffe.jpg" />
<photo id="6" url="images/mydirectory/Twins1.JPG" />
</photos>
</websiteinfo>
</mywebsite>
In de constructor vraag ik de XML op, start ik de timer (2000 ms), maak een nieuwe loader container voor de afbeeldingen.
De timer roept de functie switchPhoto() aan, die kijkt of hij alle items uit de XML gehad heeft, is dit het geval leegt hij de container.
Iemand een idee waar het mis gaat?