AS3: la rationalisation d'un « chargeur universel »
-
12-09-2019 - |
Question
script Flash Action 3, lorsque vous devez charger du texte, vous utilisez une classe appelée URLLoader
, et quand vous avez besoin de charger une image (ou .swf) que vous utilisez une classe appelée « chargeur ». Pour autant que je sache, le chargement d'un .bmp avec URLLoader
est aussi inutile que le chargement d'un .xml dans un chargeur -. Il ne calcule pas
Je fais une classe qui gère une file d'attente d'actifs externes à charger - mais en dehors de diviser l'URL cible pour vérifier l'extension du fichier, je ne peux pas trouver un bon moyen de savoir si chaque URL nécessite une URLLoader
ou un chargeur. En tout cas, il est imaginable qu'une URL .php peut renvoyer soit une image ou un document - donc il n'y a aucun moyen de compter sur les noms de fichiers à dicter le type de classe de chargement à utiliser
Toutes les idées sur la façon de détecter de manière fiable la classe pour le travail sur une base URL par URL?
La solution
bien, la question la plus délicate, consiste à déterminer le type de la cible ...
- regardant l'URL est assez simple, mais peut ne pas toujours ... certaines personnes diffusent des images de phps et ainsi de suite ...
- vous pouvez le faire comme navigateur ... commencer le chargement, puis regarder ce qu'il est ... maintenant encore, il y a de multiples possibilités ...
- charger les données sous forme de données binaires ... lorsque vous avez terminé, regardez la séquence de démarrage ... est-ce PNG (
89 50 4E 47 0D 0A 1A 0A
)? GIF (47 49 46 38 39 61
)? JPEG (FF E0
)? SWF ("FWS"
(drôle, non?))? toute autre chose devrait être texte ou base ... dans le cas d'une image, le charger dans unLoader
avecLoader::loadBytes
... soyez prudent avec SWF mais ... vous ne devez charger graphicals comme ça ... Les fonds souverains dans tout autre cas, le convertir en une chaîne en utilisant le bon encodage (idéalement des données de texte est servi en UTF8) ... alors peut-être que vous pouvez deviner déjà, si elle peut être XML, JSON ou variables de code URL ... essayez l'analyse syntaxique (en utilisant des classesXML
,com.adobe.serialization.JSON
,flash.net.URLVariables
) ... si tout échoue, il est probablement juste texte (vous pouvez essayer de vérifier que superficiellement ... si vous voulez une entrée à ce sujet, laissez-moi un commentaire) ... - faire la
HTTP
vous ... ouvrir une socket et charger la source ... vous obtiendrez mime-types en plus ... rien que vous pouvez compter sur, mais ça aide ... il y a un la mise en œuvre deHTTP
àAS3
... une fois que vous avez les données
- charger les données sous forme de données binaires ... lorsque vous avez terminé, regardez la séquence de démarrage ... est-ce PNG (
- passer le type manuellement ... pure et simple ... et vous ne comptez pas sur quelqu'un d'autre ...
il y a aussi une différence importante entre Loader et URLLoader ... chargeur peut charger les domaines, sandboxing simplement son contenu de données afin que vous ne pouvez pas regarder dedans ... URLLoader ne peut charger de votre domaine et les domaines qui permettent ce explicitement en utilisant des fichiers de stratégie de domaine croix ...
aussi, le chargement, qui sont les fonds souverains non seulement des éléments graphiques externes, mais vous voulez vraiment l'interface avec, vous ne devriez pas l'utiliser, car vous avez besoin de contrôle sur la LoaderContext etc ...
Alors, oui ... quelque façon que vous choisissez, bonne chance ...;)
greetz
back2dos
Autres conseils
Bulkloader fait quelques devinettes basé sur l'URL, peut-être prendre un coup d'oeil dans la source et voir comment ils le font?
Personnellement, je préciser exactement comment vous souhaitez vous charger un objet si elle est une image ou xml. Depuis que je l'ai écrit quelques chargeurs de file d'attente, je suggère que vous ne suivre juste une chaîne d'URL, mais un ensemble d'objets avec des choses comme, l'URL à charger, si elle a chargé, la priorité de charge, et le type. Voici le code psudo.
class QueueObject{
var URLtoLoad:String;
private var hasLoaded:Boolean = false;
var isDataObject:Boolean = false;
var queuePriority:Number = 3; //
}
Dans votre code lorsque vous voulez ajouter quelque chose dans votre file d'attente.
il suffit d'aller
var loadObject:QueueObject = new QueueObject();
loadObject.URLtoLoad = "http://theurl.com/somedata.xml";
loadObject. isDataObject= true;
// pousser Maintenant ceci dans la classe super chargeur que vous avez écrit qui va gérer la file d'attente. J'envoyer l'objet à charger, la référence à la portée actuelle par exemple, cela, et le nom de la fonction que vous voulez appeler quand cet objet est chargé.
MyStaticLodingClass.addQueueObject(loadObject, this, myFunctionThatYouWillCallWhenDone);
Cette classe doit avoir maintenant au-dessus d'un tableau que vous pouvez trier par ordre de priorité pour vous donner des éléments à charge, ce que leurs types sont et de leur URL. De cette façon, vous pouvez
Cela peut aider ou non.
Autre rendre sage quelque chose à comprendre quel type d'objet que vous essayez de charger, par exemple BMP et utiliser le chargeur correct basé sur une recherche pour cet objet.