|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Один загрузчик для текста и картинок
Всем привет.
Хочу написать класс, который смог бы загружать JSON и картинки JPG, PNG. Подскажите пожалуйста, как бы это правильней реализовать? Готовые решения типа менеджеров загрузки не интересуют. Как я полагаю, при окончании загрузки мне полученные данные нужно складывать в какой-нибудь контейнер data:* и оттуда забирать по окончанию события? Как правильнее сделать, т.к. загружаемые данные разных типов... И Loader не сможет забирать, если будут приходить текстовые данные - получается мне перед этим нужно проверять расширение файла? Так вот начал: package { import flash.display.Loader; import flash.events.Event; import flash.events.HTTPStatusEvent; import flash.events.IOErrorEvent; import flash.net.URLLoader; import flash.net.URLLoaderDataFormat; import flash.net.URLRequest; import flash.system.LoaderContext; public class MainLoader { private var _urlLoader:URLLoader; private var _loader:Loader; public var data:*; public function MainLoader(url:String) { _urlLoader = new URLLoader(); _urlLoader.dataFormat = URLLoaderDataFormat.BINARY; _urlLoader.addEventListener(Event.COMPLETE, onBinaryLoadCompleteHandler); _urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onBinaryIOErrorHandler); _urlLoader.addEventListener(HTTPStatusEvent.HTTP_STATUS, onBinaryHTTPStatusHandler); _urlLoader.load(new URLRequest(url)); } private function onBinaryHTTPStatusHandler(e:HTTPStatusEvent):void { } private function onBinaryIOErrorHandler(e:IOErrorEvent):void { } private function onBinaryLoadCompleteHandler(e:Event):void { _loader = new Loader(); var context:LoaderContext = new LoaderContext(); context.allowCodeImport = true; _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadCompleteHandler); _loader.loadBytes(e.currentTarget.data, context); } private function onLoadCompleteHandler(e:Event):void { trace('COMPLETE!'); } } }
__________________
кто не отвечает, того garbage collector забирает |
|
|||||
Вариантов как это сделать много. Если вас не интересуют готовые решения, то хотя бы посмотрите на гитхабе как они работают.
|
|
|||||
Цитата:
https://github.com/Gamua/Starling-Fr...ssetManager.as
__________________
Дети не должны знать о своих родителях |
|
|||||
Потому что хочу разобраться. Да и задача стоит не сложная. Сейчас в моем приложении работают и URLLoader для загрузки JSON. И Loader для подгрузки картинок. И просто хочу вынести их в отдельный класс. Не хочу использовать менеджер с кучей лишнего функционала. Да и свой класс мне всегда проще усовершенствовать либо найти ошибку.
Поэтому столкнулся с этими вопросами: 1) как определить тип получаемого файла? По первым битам, HTTP заголовки? Могу конечно просто в MainLoader передавать некий идентификатор, что сейчас вот гружу картинку, а сейчас json.. Но считаю правильней было бы, если загрузчик сам определял тип 2) каким образом класс должен отдавать данные разного типа, если это может быть картинка либо json ?
__________________
кто не отвечает, того garbage collector забирает |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
Цитата:
Цитата:
|
|
|||||
Цитата:
Вот к примеру (это класс из утилит Dragon Bones), как можно отпределить типы картинок и zip. Мне нужен был зип, и я добавил туда байты зипа из спецификации. То же самое можно сделать и для других типов файлов. Достаточно найти спецификацию типа и посмотреть что у него пишется в хэдэр. package { import flash.utils.ByteArray; public class BytesType { public static const SWF:String = "swf"; public static const PNG:String = "png"; public static const JPG:String = "jpg"; public static const ATF:String = "atf"; public static const ZIP:String = "zip"; public static function getType(bytes:ByteArray):String { var type:String; var b1:uint = bytes[0]; var b2:uint = bytes[1]; var b3:uint = bytes[2]; var b4:uint = bytes[3]; if ((b1 == 0x46 || b1 == 0x43 || b1 == 0x5A) && b2 == 0x57 && b3 == 0x53) { //CWS FWS ZWS type = SWF; } else if (b1 == 0x89 && b2 == 0x50 && b3 == 0x4E && b4 == 0x47) { //89 50 4e 47 0d 0a 1a 0a type = PNG; } else if (b1 == 0xFF) { type = JPG; } else if (b1 == 0x41 && b2 == 0x54 && b3 == 0x46) { type = ATF; } else if (b1 == 0x50 && b2 == 0x4B) { type = ZIP; } return type; } } } Профит. п.с. Но самый простой способ определить - это просто использовать расширение.
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
Цитата:
За пример спасибо! Поэксперементирую А вот как распознать json, xml ?.. это ведь текстовые файлы. Полагаю, тут скрипт должен анализировать структуру.. Либо парсером проходить - если ошибки нет, то формат верный. Но, думается, этот вариант не очень хороший.
__________________
кто не отвечает, того garbage collector забирает Последний раз редактировалось djken; 13.07.2017 в 21:48. |
|
|||||
Регистрация: Mar 2007
Сообщений: 319
|
Исключить вначале символы " ","\n","\r" (байты 0x20 0xa 0xd) затем для Json вначале будет символ "{" или "[" (0x7b 0x5b) у XML "<" (0x3c), либо в заголовке ответа ожидать нужный Content-Type application/json, application/xml если все правильно сделано на стороне раздачи
а вообще знание о том что это за файл есть из контекста использования, странно предполагать что получив json ты попытаешься засунуть его в Bitmap. передавай загрузчику url и тип того что ты хочешь получить, излишняя адаптивность багоемка. В идеале нужно абстрагировать контент от менеджера загрузок, использовать один менеджер который всегда загружает байты(URLLoader) и отдает их абстрактному контенту/интерфейсу(IContent), где конкретный контент инстанцирован тобой(в нужном/ожидаемом контексте) и этот конкретный контент(PNGContent,JSONContent,XMLContent,SoundContent) уже решает(и знает) что с байтами делать, если text/json/xml readUTFBytes, если картинка Loader.loadBytes. итого поверх этого проще запилить кэширование, пулинг, сохранение в SharedObject и в памяти будет меньше весить при неиспользуемом состоянии и это все при глобальном контроле загрузок(очередь по приоритетам, ограничение по одновременной загрузке, отмена загрузок)
__________________
RocketJump Последний раз редактировалось Nooob; 14.07.2017 в 00:20. |
Часовой пояс GMT +4, время: 15:35. |
|
« Предыдущая тема | Следующая тема » |
|
|