2010-05-05 2 views
2

initialise Problème: Un fichier de configuration XML doit être chargé à l'exécution et être prêt quand est appelé createChildren() de l'application. Au plus tard, car les valeurs de configuration sont nécessaires pour initialiser correctement les composants enfants. De préférence, je voudrais que le chargement de la configuration soit terminé avant même que l'application ne soit créée. En bref, je veux faire:Comment précharger un fichier dans Flex avant l'application

  1. configuration de charge, puis
  2. initialiser l'application en utilisant la configuration chargée.

J'ai créé un préchargement personnalisé pour aider à résoudre ce problème. Mais il s'avère que la méthode createChildren() de l'application est déjà appelée lors du préchargement, lorsque la configuration n'est pas encore garantie. C'est-à-dire, avant que le preloader personnalisé distribue l'événement COMPLETE.

Merci pour toute aide à l'avance.

Répondre

3

J'ai trouvé une solution au problème. La clé consistait à intercepter l'événement FlexEvent.INIT_PROGRESS du préchargeur, à le mettre en file d'attente et à arrêter sa propagation jusqu'à ce que la configuration soit entièrement chargée. Cela arrête effectivement le cadre pour procéder à l'initialisation de l'application. Après le chargement de la configuration, redispatch les événements en file d'attente, laissant le cadre terminer la phase de préchargement. Exemple de code ci-dessous (uniquement les éléments pertinents):

public class PreloaderDisplay extends Sprite implements IPreloaderDisplay { 
    // mx.preloaders.IPreloaderDisplay interface 
    public function set preloader(preloader:Sprite):void { 
     // max priority to ensure we catch this event first 
     preloader.addEventListener(FlexEvent.INIT_PROGRESS, onInitProgress, false, int.MAX_VALUE); 
     startLoadingConfiguration(); 
    } 
    private function onInitProgress(e:FlexEvent):void { 
     if (isConfigurationLoading) { 
      queuePreloaderEvent(e); 
      e.stopImmediatePropagation(); 
     } 
    } 
    private function onConfigurationLoaded():void { 
     dispatchQueuedPreloaderEvents(); 
    } 
} 

Pour l'utiliser dans l'application:

<mx:Application preloader="the.package.of.PreloaderDisplay"> 
1

La façon la plus simple (je pense) est de créer une toile « porte » qui va créer le contenu des applications après que le fichier de contexte est chargé, à savoir:

(code psuedo)

Application.mxml:

<mx:Canvas> 
    <mx:Script> 
     public function init():void{ 
      loadXML(); 
     } 

     public function handleXMLLoaded():void{ 
      this.addChild(myApplicationContent); 
     } 
    </mx:Script> 
</mx:Canvas> 

MyApplicationContent.mxml

<mx:Canvas> 
<!-- contains all your components etc --> 
</mx:Canvas> 
+0

En fait, j'utilisé que comme une solution de contournement, mais je voulais savoir s'il y a une meilleure façon. Merci pour votre suggestion. –

Questions connexes