Adobe Flex: HowTo URLLoader [updated]

Auf der Suche wie man Dateien in Flex einlädt, findet man bei Adobe und anderen Seiten häufig folgendes Beispiel:

package {
import flash.display.Sprite;
import flash.events.*;
import flash.net.*;

public class URLLoaderExample extends Sprite {
public function URLLoaderExample() {
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, completeHandler);
var request:URLRequest = new URLRequest(“urlLoaderExample.txt”);
try {
loader.load(request);
} catch (error:Error) {
trace(“Unable to load requested document.”);
}
}

private function completeHandler(event:Event):void {
var loader:URLLoader = URLLoader(event.target);
trace(“completeHandler: ” + loader.data);
}
// alle weiteren Handler gelöscht
}
}// Quelle www.adobe.com

Dies lädt schnell dazu ein, den Code-Schnipsel in den <mx:Script> Tag seiner MXML Datei zu kopieren, per initialize-Event oder creationComplete-Event diese Funktion aufzurufen und man hat sein Datenmodell in der ViewComponente drin. Funktioniert, aber schön ist das nicht!

Ich hätte das beinah auch so gemacht, wenn ich mein Modell nicht in zwei Views brauchen würde, und wenn ich nicht 10 XML Dateien als Modell hätte. Nach langem Suchen wurde ich in meinem Kopf fündig: in der C & OOP Klausur habe ich einem Objekt per Parameter Funktionen übergeben. Also habe ich folgende Storage Klasse geschrieben:
Und da meine erste Version einer kleinen DOS-Attacke glich, habe ich jetzt eine Warteschlange eingebaut, sodass die XML Dateien nacheinander geladen werden und nicht alle gleichzeitig…

package
{
import flash.events.*;
import flash.net.*;

import mx.collections.XMLListCollection;

public class Storage {
[Bindable] public var homeData:XMLListCollection = null;
[Bindable] public var newsData:XMLListCollection = null;

// URLLoader für alle
private var loader:URLLoader = null;

// Lade-Warteschlange
private var queue:Object = new Object();

// singleton
private static var storage:Storage = null;
public static function getInstance():Storage {
if ( storage == null ) storage = new Storage();
return storage;
}

public function loadHomeData(url:String):void {
if ( homeData == null )	load(url, this.setHomeData);
}

public function setHomeData(event:Event):void {
homeData = new XMLListCollection(new XMLList(event.target.data));
// loader Variable null setzen
loader = null;
// naechste Datei laden
loadNext();
}

public function loadNewsData(url:String):void {
if ( newsData == null ) load(url, this.setNewsData);
}
public function setNewsData(event:Event):void {
newsData = new XMLListCollection(new XML(event.target.data).children());
loader = null;
loadNext();
}

private function load(url:String, handlerObject:Function):void
{
// ueberpruefen ob die URL schon in der Warteschlange ist
if ( queue[url] == undefined )  {
queue[url] = {url: url, handlerObject : handlerObject};
}
// Ueberpruefen ob grade ein Ladevorgang aktiv ist
if ( loader == null )  {
loader = new URLLoader();
//configure Listeners
loader.addEventListener(Event.COMPLETE, handlerObject);
// load File
var request:URLRequest = new URLRequest(url);
try {
loader.load(request);
} catch (error:Error) {

trace(“Unable to load ‘” + url + “‘”);
}
}
}

private function loadNext():void {
// ersten Index aus der Warteschlange holen
for ( var i:String in queue ) {
break;
}
// Ueberpruefen ob ein gueltiges Element vorleigt
if ( queue[i] != undefined ) {
// Ladevorgang anstossen
load(queue[i]['url'], queue[i]['handlerObject']);
}
}
}

Nun rufe ich in den Views im initialize-Event

initialize="{Storage.getInstance().loadNewsData('news.xml')}"

auf und nutze das public Object newsData als dataProvider. Damit das ganze übersichtlicher bleibt habe ich mich hier nur auf das Complete Event beschränkt.

Ich habe die load Funktion extra gewrappt, damit ich bei Änderungen in der Storage Klasse nicht alle Views durchwuseln muss.

Slapsticker Dancing Contest Gewinner Video

Man kann das Video zwar auch auf der Slapsticker Seite sehen, aber wer weiss wie lange noch. Also stelle ich hier unser Gewinnervideo endlich auch mal online:

Short Story short: Die Slapstickers haben zu einem Dancing Contest aufgerufen, Paul, Arndt, Marian und ich haben den Ruf gehört. Ein minimaler Plot um einen furchtbar mysteriösen Koffer war schnell gefunden, sowie eine Metallleiste, jene die Kamera am Koffer fixiert (KofferSteady).

Ab dann haben wir uns von Szene zu Szene gehangelt indem wir durch Köln liefen und fuhren, und immer wenn uns danach war etwas gefilmt haben. Das Shooting hat einen Donnerstag Abend gedauert, der Schnitt einen kompletten Freitag.

Im Schnitt hatte ich dann mehrere Schnipsel die nachher ein Ganzes ergeben sollten, also zerstückelte ich das Lied in kleine Teile (Intro, Strophe, Bridge, Refrain) und passte pro Stück das Filmmaterial an. Dann reihte ich die Schnipsel wieder aneinander und fertig war das Video!

Betrachter des Videos werden sich nun fragen “Wenn du das gemacht hast, warum stellst Du es nicht in einer besseren Qualität online?” – Tja, am Ende musste alles sehr schnell gehen und das Video musste übers Web zu den Slapstickers geschickt werden, also renderte ich es erstmal als wmv raus. Kurze Zeit später habe ich mal mein Vista neu aufgesetzt (sowas mach ich öfters) und die coole LG Vista DVD fand es besser sich auf meiner Arbeitspartition breit zu machen, anstatt die für sie bestimmte Partition zu nehmen! Damit waren alle Daten futsch und Recovery Tools fanden nur noch Fragmente der Quelldateien…

Playground Zero goes Flex

Im Moment arbeite ich (neben meiner Diplomarbeit, als Ausgleich sozusagen) an einem Relaunch der Playground Zero Webseite. Das hatte ich schon länger vor und ein Webspace Umzug gibt mir nun die Gelegenheit endlich eine Webseite mit dem Flex Framework umzusetzten. Nun man mag darüber streiten wie sinnvoll es ist, eine ganze Seite in Flex umzusetzten, aber da Flex im MVC Flow so wunderschön den Controller übernimmt muss man sich “nur” mit der GUI Programmierung und der Datenmodellprogrammierung rumschlagen und da ist es schön das die Vernetzung von beiden Flex übernimmt.
Das KeyFeature habe ich nun schonmal umgesetzt bekommen, eine Galerie die Bilder/Audio/Video einfach so anzeigt und abspielt, nun fehlt noch der Rest und dann muss das noch unter einen Hut gebracht werden. Entwicklerschätzung: 2 Tage, also wird in zwei Wochen vielleicht wirklich was draus!
Ich werde hier immer Statusberichte geben!

Juchu! Noch ein Blog

Ja, darauf hat die Welt gewartet, Raoul Kramer dem sein Blog!

Als letzter der auf den Blogzug aufspringt wage ich nun auch den Versuch der Welt mein endliches Wissen zu geben. Ich habe lange überlegt welche Richtung ich einschlagen soll mit einem Blog und die Antwort ist ganz einfach: querfeldein. Also werde ich hier privates wie berufliches vermischen.