views:

687

answers:

2

I am writing a mxml component

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"  preinitialize="onPreInitialize();"  "creationComplete()">


<mx:Script>
<![CDATA[
 private function onPreInitialize():void
 {
  addEventListener( "RemoteResourceLoaded", remoteResourceLoaded );
  loadARemoteResource(); 
 }
]]>
</mx:Script>

I have some mxml tags in my component that reference variables from the remote resource. This throws null reference errors because flex tries to load all the mxml components before the remote resource has been loaded. I would love it if I could make flex wait in its pre-initialize state, and finish loading the resources before it moved on to initializing all the child components. Any ideas?

A: 

Perhaps don't make the loading dependent on remote resources. Your app should gracefully degrade when you have resources that don't load on time, or don't load at all.

Don't load anything external until everything is initialized.

Kekoa
A: 

You have to chain your methods in a specific manner, you can easily do that in a following way (this code is not tested):

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
 preinitialize="onPreInitialize();"
 creationComplete="onCreationComplete()">
 <mx:Script>
  <![CDATA[

   private function onPreInitialize():void {
    addEventListener( "RemoteResourceLoaded", remoteResourceLoaded );
    loadARemoteResource();  
   }
   private function loadRemoteResource():void {
    // ...
   }

   private var _created:Boolean = false;

   private function onCreationComplete():void {
    // whatever you have here move it to the runTheApp() method...
    _created = true;
    runTheApp();
   }

   private var _resourcesReady:Boolean = false;

   private function remoteResourceLoaded(event:Event):void {
    // process your resources...
    _resourcesReady = true;
    runTheApp();
   }

   // this method will be called once the app is created
   // and once when your resources are loaded
   //
   // 1:
   // if app is created before resources are loaded its body
   // is not going to be executed as _resourcesReady flag is false
   // when resources are loaded it will then be called again
   // and the body will be executed
   //
   // 2:
   // if the resources are loaded before the app is created
   // (during debugging?) it's gonna be called once but the
   // _created flag is still false so the body is not processed
   // when creationComplete fires both _created is set to true
   // and method is called again, both conditions are true
   // and the body gets executed

   private function runTheApp():void {
    if ( _resourcesReady && _created ) {
     // now the app is fully created and resources are loaded
    }
   }

  ]]>
 </mx:Script>
</mx:Application>

This shows the generic idea but I think it answers your question. It is generally the matter of waiting for the resource if it takes a long time to load and process creationComplete correctly if resource is loaded before creationComplete fires.

Hope this helps.

radekg