AS3: racionalizar a 'carregador universal'
-
12-09-2019 - |
Pergunta
No Flash Action Script 3, quando você precisa de texto de carga, você usa uma classe chamada URLLoader
, e quando você precisa carregar uma imagem (ou .swf) você usa uma classe chamada 'Loader.' Tanto quanto eu sei, o carregamento de uma .bmp com URLLoader
é tão inútil como carregar um .xml em um Loader -. Isso não computa ??p>
Eu estou fazendo uma classe que lida com uma fila de ativos externos a ser carregado - mas além de rachar o URL de destino para verificar a extensão do arquivo, eu não consigo descobrir uma boa maneira de saber se cada URL requer um URLLoader
ou um Loader. De qualquer forma, é imaginável que uma URL .php pode retornar uma imagem ou um documento - por isso não há maneira de contar com os nomes de arquivo para ditar o tipo certo de classe loader para uso
Algumas ideias sobre como detectar com fiabilidade a classe certa para o trabalho em uma base URL-a-URL?
Solução
Bem, a pergunta mais complicada, é determinar o tipo do alvo ...
- olhando para o url é bastante simples, mas pode nem sempre trabalho ... algumas pessoas servir imagens phps e assim por diante ...
- você poderia fazê-lo como navegador ... começar a carregar, e depois olhar para o que é ... agora de novo, há várias possibilidades ...
- carregar os dados como dados binários ... quando feito, olhar para a seqüência de partida ... é PNG (
89 50 4E 47 0D 0A 1A 0A
)? GIF (47 49 46 38 39 61
)? JPEG (FF E0
)? SWF ("FWS"
(engraçado, não é?))? qualquer outra coisa deve ser de texto ou de texto baseado ... no caso de uma imagem, carregá-lo em umLoader
comLoader::loadBytes
... ter cuidado com SWF embora ... você só deve carregar graphicals SWFs assim ... em qualquer outra caso, convertê-lo em uma string usando a codificação direita (idealmente dados de texto é servido em utf8) ... então talvez você já pode imaginar, se ele pode ser XML, JSON ou variáveis ??URL-codificados ... tente analisar (usando classesXML
,com.adobe.serialization.JSON
,flash.net.URLVariables
) ... se tudo falhar, é provavelmente apenas de texto (você pode tentar verificar se superficialmente ... se você quiser algumas informações sobre isso, me deixe um comentário) ... - faça o
HTTP
si mesmo ... abrir um socket e carregar a fonte ... você vai ter mime-types além ... nada que você pode confiar, mas ajuda ... há um implementaçãoHTTP
emAS3
... uma vez que você tem os dados
- carregar os dados como dados binários ... quando feito, olhar para a seqüência de partida ... é PNG (
- passe o tipo manualmente ... pura e simples ... e você não confiar em ninguém ...
também há uma diferença importante entre Loader e URLLoader ... Loader pode carregar dados accross domínios, simplesmente sandboxing seu conteúdo para que você não pode olhar para ele ... URLLoader só pode carregar a partir do seu domínio e domínios que explicitamente permitem este usando arquivos de política de domínio cruzado ...
Além disso, os fundos soberanos de carregamento, que não são elementos gráficos apenas externas, mas você realmente quer fazer a interface com, você não deve usar isso, pois você precisa de controle sobre a LoaderContext etc ...
Então, sim ... qualquer que seja a forma que escolher, boa sorte ...;)
greetz
back2dos
Outras dicas
bulkloader faz algumas suposições com base na URL, talvez dar uma olhada em a fonte e ver como eles fazem isso?
Pessoalmente, gostaria de especificar exatamente como você gostaria de carregar você opor-se se é uma imagem ou xml. Desde que eu tenha escrito alguns carregadores de fila, eu sugiro que você Não basta controlar uma seqüência de URL, mas um conjunto de objetos com coisas como, o URL para carregar, se ele foi carregado, prioridade de carga e tipo. Aqui está um código psudo.
class QueueObject{
var URLtoLoad:String;
private var hasLoaded:Boolean = false;
var isDataObject:Boolean = false;
var queuePriority:Number = 3; //
}
Agora, em seu código quando você deseja adicionar algo em sua fila.
simplesmente ir
var loadObject:QueueObject = new QueueObject();
loadObject.URLtoLoad = "http://theurl.com/somedata.xml";
loadObject. isDataObject= true;
// Agora empurrar este para a classe loader impressionante que você tenha escrito que irá gerenciar a fila. Eu iria enviar o objeto a carga, a referência para o atual escopo, por exemplo, este, bem como o nome da função que você deseja chamar quando este objeto foi carregado.
MyStaticLodingClass.addQueueObject(loadObject, this, myFunctionThatYouWillCallWhenDone);
Essa classe acima deve agora ter um array que pode ordenar por prioridade para lhe dar itens para carregar, o que os seus tipos são e seu URL. Desta forma, você pode
Isto pode ajudar ou não.
Outro sábio fazer algo para descobrir qual o tipo de objeto que você está tentando carregar, por exemplo, BMP e usar o carregador correto baseado em uma pesquisa para este objeto.