Forums Développement Multimédia

Les formations Mediabox
Les formations Mediabox

Chargement de fichier et MassLoad

Compatible ActionScript 3. Cliquer pour en savoir plus sur les compatibilités.Le 29 octobre 2006

Introduction

Grâce à la nouvelle architecture du framework AS3, les chargements de fichiers se font un peu plus difficilement, mais de manière bien plus puissante ! Dans ce tutoriel, je vais passer rapidement sur la manière de charger un fichier et présenter un peu plus en profondeur une librarie de chargement en masse (ou MassLoad).

Charger un fichier

Il existe plusieurs classes permettant de charger des fichiers (URLLoader, Loader, SWFLoader, …). La classe la plus intéressante est URLLoader car elle nous permet de charger tout type de fichier, indépendamment de son contenu. Cela est très utile si, par exemple, vous voulez mettre un SWF en cache sans pour autant l'exécuter. Ci-dessous, nous chargeons un fichier texte basique :

package
{
    import flash.display.*;
    import flash.net.*;
    import flash.events.*;
 
    public class SimpleFileLoader extends Sprite
    {
        private var field:TextField;
 
        public function SimpleFileLoader()
        {
             //création et affichage du champs de texte
             field = new TextField();
             field.width = 250;
             field.height = 300;
 
             addChild(field);
 
             //préparation du chargement
             var loader:URLLoader = new URLLoader();
             loader.dataFormat = URLLoaderDataFormat.TEXT; //simple fichier texte
 
             //écoute du chargement
             loader.addEventListener(Event.OPEN, onOpen);
             loader.addEventListener(Event.COMPLETE, onComplete);
             loader.addEventListener(ProgressEvent.PROGRESS, onProgress);
 
             //lancement du chargement
             loader.load(new URLRequest("file.txt"));
        }
 
        protected function onOpen(evt:Event):void
        {
             field.appendText("Chargement commencé");
        }
 
        protected function onComplete(evt:Event):void
        {
             field.appendText("\nChargement terminé");
        }
 
        protected function onProgress(evt:ProgressEvent):void
        {
             var percent:uint = Math.floor(evt.bytesLoaded/evt.bytesTotal*100);
             field.appendText("\nFichier chargé à "+percent+"%");
        }
    }
}

Je ne m'attarde pas plus la-dessus, cela reste un fonctionnement relativement simple pour tout développeur quelque peu chevronné.

Chargement en masse (MassLoad)

Vous pouvez télécharger la librairie par ici ! Celle-ci vous permet de gérer une liste de fichiers à charger. Comment cela fonctionne-t-il ? Le moteur est composé comme suit :

  • l'interface ch.thecaptain.net.ILoadableFile représente un fichier à charger
  • l'interface ch.thecaptain.net.IMassLoader représente un gestionnaire de chargement de masse

L'implémentation de ces deux interfaces est faite comme suit :

  • ch.thecaptain.net.BasicLoadableFile gère n'importe quel fichier chargeable
  • ch.thecaptain.net.ObjectMassLoader gère le chargement des fichiers (parallèlement ou séquentiellement)

Voyons comment on peut utiliser cette bibliothèque tout simplement :)

Création de fichier chargeables

package
{
       import ch.thecaptain.net.*;
       import flash.net.*;
       import flash.events.*;
       import flash.display.*;
 
       public class MassLoadDemo extends Sprite
       {
            public function MassLoadDemo()
            {
                 //création d'un fichier à charger
                 var urlFile1:URLRequest = new URLRequest("file.txt"); //url
                 var loaderFile1:URLLoader = new URLLoader(); //chargeur
                 var file1:BasicLoadableFile = new BasicLoadableFile(urlFile1, loaderFile1); //fichier pouvant être chargé
 
                 //création d'un 2ème fichier à charger
                 var urlFile2:URLRequest = new URLRequest("otherFile.swf");
                 var loaderFile2:Loader = new Loader();
                 var file2:BasicLoadableFile = new BasicLoadableFile(urlFile2, loaderFile2);
            }
       }
}

Nos 2 fichiers étant prêts à être chargé, nous pouvons instancier les gestionnaire de chargement et y ajouter les fichiers !

Création du gestionnaire de chargement

package
{
       import ch.thecaptain.net.*;
       import flash.net.*;
       import flash.events.*;
       import flash.display.*;
 
       public class MassLoadDemo extends Sprite
       {
            public function MassLoadDemo()
            {
                 //création d'un fichier à charger
                 var urlFile1:URLRequest = new URLRequest("file.txt"); //url
                 var loaderFile1:URLLoader = new URLLoader(); //chargeur
                 var file1:BasicLoadableFile = new BasicLoadableFile(urlFile1, loaderFile1); //fichier pouvant être chargé
 
                 //création d'un 2ème fichier à charger
                 var urlFile2:URLRequest = new URLRequest("otherFile.swf");
                 var loaderFile2:Loader = new Loader();
                 var file2:BasicLoadableFile = new BasicLoadableFile(urlFile2, loaderFile2);
 
                 //gestionnaire de chargement
                 var loader:ObjectMassLoader = new ObjectMassLoader();
 
                 //ajout des fichiers
                 loader.addObject(file1);
                 loader.addObject(file2);
 
                 //lancement du chargement
                 loader.load();
            }
       }
}

Il est intéressant de noter que la classe ObjectMassLoader possède un attributes nommé parallelFiles pouvant être initialisé dans le constructeur. Celui-ci détermine combien de fichiers peuvent être chargés en même temps. Par défaut, le chargement de tous les fichiers est lancé lors de l'appel à la méthode load. Grâce à ce mécanisme, on peut très facilement passer d'un massloader séquentiel à un massloader “parallèle” :

var sequentielMassLoader:ObjectMassLoader = new ObjectMassLoader(1); //chargement séquentiel
var parallelMassLoader:ObjectMassLoader = new ObjectMassLoader(); //chargement parallèle
var fiveMassLoader:ObjectMassLoader = new ObjectMassLoader(5); //chargement de 5 fichiers en même temps au maximum

Ajout des écouteurs

La classe ObjectMassLoader permet de gérer tous les événements de bases d'un chargeur ainsi que quelques événements supplémentaires :

  • Event.OPEN : lancement du chargement des fichiers
  • Event.COMPLETE : tous les fichiers sont chargés
  • ProgressEvent.PROGRESS : le chargement global a progressé
  • MassLoaderEvent.FILE_OPEN : le chargement d'un fichier de la liste a commencé
  • MassLoaderEvent.FILE_COMPLETE : le chargement d'un fichier de la liste est terminé
  • MassLoaderErrorEvent.FILE_IO_ERROR : le chargement d'un fichier a provoqué une erreur I/O
  • MassLoaderErrorEvent.FILE_SECURITY_ERROR : le chargement d'un fichier a provoqué une erreur de sécurité
  • MassLoaderProgressEvent.FILE_PROGRESS : le chargement d'un fichier a avancé
  • MassLoaderHTTPStatusEvent.FILE_HTTP_STATUS : les headers http d'un fichier ont été reçus

Grâce à ceux-ci on peut aisément savoir lorsque le chargement est terminé :

package
{
       import ch.thecaptain.net.*;
       import flash.net.*;
       import flash.events.*;
       import flash.display.*;
 
       public class MassLoadDemo extends Sprite
       {
            public function MassLoadDemo()
            {
                 //création d'un fichier à charger
                 var urlFile1:URLRequest = new URLRequest("file.txt"); //url
                 var loaderFile1:URLLoader = new URLLoader(); //chargeur
                 var file1:BasicLoadableFile = new BasicLoadableFile(urlFile1, loaderFile1); //fichier pouvant être chargé
 
                 //création d'un 2ème fichier à charger
                 var urlFile2:URLRequest = new URLRequest("otherFile.swf");
                 var loaderFile2:Loader = new Loader();
                 var file2:BasicLoadableFile = new BasicLoadableFile(urlFile2, loaderFile2);
 
                 //gestionnaire de chargement
                 var loader:ObjectMassLoader = new ObjectMassLoader();
 
                 //ajout de l'écouteur
                 loader.addEventListener(Event.COMPLETE, onComplete);
 
                 //ajout des fichiers
                 loader.addObject(file1);
                 loader.addObject(file2);
 
                 //lancement du chargement
                 loader.load();
            }
 
            protected function onComplete(evt:Event):void
            {
                 trace("Tous les fichiers ont été chargés");
            }
       }
}

Source, documentation & exemples

Vous trouverez tout ce dont vous avez besoin dans le zip Bien évidemment toutes vos suggestions, bug report et autres sont les bienvenues ! N'hésitez pas à nous en faire part sur le forum.