Fodboldsystem - reload sig selv
Hej eksperter.Jeg har lavet denne applikation til visning af aktuelle fodboldkampe i forskellige ligaer (demolink: http://www.videobanner.dk/eb/liveresultater2010 )
Når XML-filerne er indlæst, går en timer igang med at tælle ned fra 2 minutter - og når de 2 minutter er gået, skal applikationen genindlæse XML-feed'et.
Det er blevet checket ved at applikationen kører, mens jeg uploader nye test-XML'er, hvor f.eks. scoren er ændret.
Alle kampene oprettes dynamisk som under-movieclips i en tom placeholder og placeres i forlængelse af hinanden.
De tilføjes samtidig med addChild-kommandoen i et MC-array:
for (var i=0; i<udvalgteKampe.length; i++) {
visFaneblad(udvalgteKampe[i].id, udvalgteKampe[i].forkortelse, i);
for (j=0; j<udvalgteKampe[i].antalKampe; j++) {
var kamp:MovieClip = new Kamp();
kamp.hjemmehold_txt.text = udvalgteKampe[i].kampe[j].hjemmehold.toUpperCase();
kamp.udehold_txt.text = udvalgteKampe[i].kampe[j].udehold.toUpperCase();
kamp.hjemmescore_txt.text = udvalgteKampe[i].kampe[j].hjemmescore;
kamp.udescore_txt.text = udvalgteKampe[i].kampe[j].udescore;
kamp.id = udvalgteKampe[i].kampe[j].kampid;
kamp.kategori = i; // Vi skal huske at denne kamp f.eks. tilhører SAS-liga'en
kamp.x = kamptaeller*612;
kamp.name = String("kamp"+kamptaeller);
kampePlaceholder.addChild(kamp);
kampmcarray.push(kamp);
kamptaeller++;
trace("ID: "+kamp.id);
kamp.buttonMode = true;
kamp.addEventListener(MouseEvent.CLICK, gaaTilURL);
}
}
Jeg har prøvet 3 muligheder
- Javascript, der genindlæser applikationen: virker, men er ikke så hensigtsmæssig, da applikationen skal kunne køre helt uafhængigt)
- Køre en nulstillingsmetode og dermed nulstille alle arrays m.m. (den giver en compilerfejl, når den kaldes fra timerEvent.
- Genindlæse sig selv (den virker fint på ovenstående URL - men Ekstra Bladet har lidt problemer med den, da den tilsyneladende giver en debug-fejl når den afvikles fra deres server)
KODEN til 1. mulighed (javascript):
public function genindlaes(event:TimerEvent) {
ExternalInterface.call("reloadLive()");
}
Koden til 2. mulighed - nulstil variabler, arrays og MC's:
public function genindlaes(event:TimerEvent) {
trace("Vi genindlæser");
main_mc.cursor_mc.visible = false;
genindlaesTimer.stop();
minTimer.stop();
for (i=0; i<udvalgteKampe.length; i++) {
// Fjern de eksisterende kamp-mc's fra stage
removeChild(kampmcarray[i]);
}
setVariables();
loadCSV(kategoriurl);
}
-> Den giver en fejlmeddelelse når timerEvent køres:
The supplied DisplayObject must be a child of the caller.
at flash.display::DisplayObjectContainer/removeChild()
Ifølge Flash-manualen betyder det tilsyneladende at et objekt er forsvundet før det forsøges fjernet... men det er IKKE tilfældet! Jeg har f.eks. prøvet at lægge en trace(kampmcarray[i]) ind FØR removeChild og den tracer fint.
Kode til 3. mulighed (genindlæsning af sig selv)
public function genindlaes(event:TimerEvent) {
trace("Vi genindlæser");
main_mc.cursor_mc.visible = false;
genindlaesTimer.stop();
minTimer.stop();
var reloadRequest:URLRequest = new URLRequest("liveresultater.swf");
var loader:Loader = new Loader();
loader.load(reloadRequest);
addChild(loader);
}
-> Den virker som nævnt på ovenstående adresse, men ikke hos Ekstra Bladet (den giver en fejl efter de 2 minutter, hvis man har debug-plugin'et). Jeg kan desværre ikke se nøjagtig, hvad fejlmeddelelsen viser, da EB ikke kører med applikationen lige nu (der er ingen aktuelle kampe i de interessante ligaer).
Jeg er mest interesseret i løsning 2 - men fatter ikke, hvorfor den giver den lidt kryptiske fejlmeddelelse.
Har I et forslag?
