АС3:оптимизация "универсального загрузчика"
-
12-09-2019 - |
Вопрос
В скрипте Flash Action 3, когда вам нужно загрузить текст, вы используете класс с именем URLLoader
, и когда вам нужно загрузить изображение (или .swf), вы используете класс под названием 'Loader.' Насколько я знаю, загрузка .bmp с помощью URLLoader
это так же бесполезно, как загрузка файла .xml в загрузчик - он не вычисляет.
Я создаю класс, который обрабатывает очередь загружаемых внешних ресурсов, но помимо разделения целевого URL-адреса для проверки расширения файла, я не могу найти хороший способ определить, требуется ли для каждого URL-адреса URLLoader
или Грузчиком.В любом случае, можно себе представить, что URL-адрес .php может возвращать либо изображение, либо документ - так что нет никакого способа рассчитывать на имена файлов, чтобы указать правильный тип класса loader для использования.
Есть какие-нибудь идеи о том, как надежно определить подходящий класс для задания по URL-адресу?
Решение
что ж, самый сложный вопрос - это определение типа цели ...
- просмотр URL -адреса довольно прост, но может не всегда сработать...некоторые люди предоставляют изображения с phps и так далее ...
- вы могли бы сделать это как браузер ...начните загрузку, а затем посмотрите, что это такое ...опять же, существует множество возможностей ...
- загрузите данные в виде двоичных данных ...когда закончите, посмотрите на начальную последовательность ...это PNG (
89 50 4E 47 0D 0A 1A 0A
)?GIF (47 49 46 38 39 61
)?JPEG (FF E0
)?SWF ("FWS"
(забавно, не правда ли?))?все остальное должно быть текстовым или основанным на тексте ...в случае с изображением загрузите его вLoader
сLoader::loadBytes
...однако будьте осторожны с SWF ...вы должны загружать графические SWF - файлы только таким образом ...в любом другом случае преобразуйте его в строку, используя правильную кодировку (в идеале текстовые данные подаются в utf8)...тогда, возможно, вы уже можете догадаться, могут ли это быть переменные в формате XML, JSON или URL...попробуйте выполнить синтаксический анализ (используя классыXML
,com.adobe.serialization.JSON
,flash.net.URLVariables
) ...если все терпит неудачу, это, вероятно, просто текст (вы можете попытаться проверить это поверхностно...если вам нужен какой-то вклад в это, оставьте мне комментарий) ... - делайте то, что
HTTP
себя ...откройте сокет и загрузите исходный код ...кроме того, вы получите mime-типы...ничего такого, на что вы могли бы положиться, но это помогает ...существуетHTTP
внедрение вAS3
...как только у вас будут необходимые данные
- загрузите данные в виде двоичных данных ...когда закончите, посмотрите на начальную последовательность ...это PNG (
- передайте тип вручную ...чистый и незамысловатый ...и ты ни на кого больше не полагаешься...
существует также важное различие между Loader и URLLoader ...Загрузчик может загружать данные по доменам, просто изолируя их содержимое, чтобы вы не могли заглянуть в него ...URLLoader может загружаться только из вашего домена и доменов, которые явно разрешают это, используя файлы междоменной политики ...
кроме того, загружая SWF-файлы, которые являются не просто внешними графическими ресурсами, но с которыми вы действительно хотите взаимодействовать, вы не должны использовать это, поскольку вам нужен контроль над LoaderContext и т.д....
так что, да ...какой бы способ вы ни выбрали, удачи вам...;)
приветствие
back2dos
Другие советы
Объемный погрузчик есть ли какие-нибудь догадки, основанные на URL, может быть, заглянуть в исходный код и посмотреть, как они это делают?
Лично я бы точно указал, как вы хотели бы загрузить свой объект, если это изображение или xml.Поскольку я написал несколько загрузчиков очередей, я предлагаю вам отслеживать не просто строку URL, а набор объектов с такими параметрами, как URL для загрузки, если он загружен, приоритет загрузки и тип.Вот некоторый псевдокод.
class QueueObject{
var URLtoLoad:String;
private var hasLoaded:Boolean = false;
var isDataObject:Boolean = false;
var queuePriority:Number = 3; //
}
Теперь в вашем коде, когда вы хотите добавить что-то в свою очередь.
просто уходи
var loadObject:QueueObject = new QueueObject();
loadObject.URLtoLoad = "http://theurl.com/somedata.xml";
loadObject. isDataObject= true;
// Теперь вставьте это в класс awesome loader, который вы написали, который будет управлять очередью.Я бы отправил объект для загрузки, ссылку на текущую область, например, this, и имя функции, которую вы хотите вызвать, когда этот объект загрузится.
MyStaticLodingClass.addQueueObject(loadObject, this, myFunctionThatYouWillCallWhenDone);
Этот класс выше теперь должен иметь массив, который вы можете отсортировать по приоритету, чтобы предоставить вам элементы для загрузки, их типы и URL-адреса.Таким образом, вы можете
Это может помочь, а может и нет.
Другими словами, сделайте что-нибудь, чтобы выяснить, какой тип объекта вы пытаетесь загрузить, например BMP, и используйте правильный загрузчик на основе поиска для этого объекта.