![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Oct 2007
Сообщений: 45
|
Всем добрый... время суток.
В общем уже часа два листаю форум - перечитал уйму инфы, но конкретной информации по теме найти так и не смог. Есть флешка, которая подгружает внешние файлы - картинки и swf-ки. В процессе работы часть этих внешних файлов загружается повторно, а то и по 20-30 раз, причем - каждый раз делается запрос по урлу и браузер возвращает закэшенный файл. Все хорошо, но браузеры работают по-разному, и в некоторых случаях все работает практически не заметно, но иногда - просто страшно тормозит. Решил может что-то вроеде внутреннего кэша сделать, но не тут-то было. Т.е. я создаю loader:Loader - гружу в него, например картинку, и добавляю его в свой кэш - массив. после загрузки я делаю TargetObject.addChild(loader); При повторном обращении по тому же адресу я беру этот же самый loader из кэш-массива и делю addChild но уже другому объекту. Флешь удаляет этот лоадер из списка отображения первого TargetObject, т.е. вся идея рушится, если на экране должны показываться оба объекта одновременно - будет видно только последний. Т.е. для корректной работы данного метода - необходимо клонировать загруженный объект, т.е. сам loader, но я так понял что это сделать нельзя. Может кто подскажет в каком направлении двигаться? Или вообще отказаться от этой идей? |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Loader#loadBytes, LoaderInfo#bytes
|
|
|||||
|
Регистрация: Oct 2007
Сообщений: 45
|
Спасибо - помогло. Правда сначала не мог рвубиться как забрать LoaderInfo, потом дошло, что событие COMPLETE вешается не на Loader, а на сам LoaderInfo и получил его в виде event.currentTarget
Цитата:
Всем спасибо. Добавлено через 4 часа 28 минут Так в продолжение темы - при повторной загрузке данных, вернее при загрузве ByteArray с помощью метода loadBytes(); В IE9 выдает эксепшн Error #2044: Необработанный IOErrorEvent:. text=Error #2124: Неизвестный тип загруженного файла. И опять же не во всех случаях. В других браузерах эксепшена не вылетает и все картинки показываются корректно. В чем может быть дело? Вот исходник класса: package Utils { import flash.display.Loader; import flash.display.DisplayObject; import flash.events.*; import flash.net.URLRequest; import flash.utils.ByteArray; public class LoaderQueue { private var _loads:Array = new Array(); private var _is_loading:Boolean = false; private var _last_loader:Loader; private var _current_load:Object; private var _loaded_objects:Object = new Object; //private var _hash_queue:Object; public function addLoad(url:String, target_obj:Object, countAttempts:int = 3):void{ var new_load:Object = { url:url, target:target_obj, countAttempts:countAttempts }; _loads.push(new_load); checkQueue(); } private function checkQueue(){ if(_loads.length){ if(!_is_loading){ _current_load = _loads.shift(); startLoad(_current_load.url, _current_load.target); } } } private function startLoad(url, target_obj):void{ //Проверяем наличие этого объекта в кэше if(_loaded_objects.hasOwnProperty(url)){ if(_loaded_objects[url].is_loaded){ //Такой объект мы уже загружали и он находится в нашем кэше if(_loaded_objects[url].loaded_object){ var loader:Loader = new Loader(); this.configureListenersBytes(loader); loader.loadBytes(_loaded_objects[url].loaded_object); target_obj.addChild(loader); } }else{ //Объект уже загружается, но еще не загружен, т.е. нужно добавиться в очередь на загрузку _loaded_objects[url].queue.push(target_obj); } checkQueue(); }else{ //В кэше нет - значит загружаем с указанного урла var _loader:Loader = new Loader(); var urlReq:URLRequest = new URLRequest(url); configureListeners(_loader.contentLoaderInfo); _loader.load(urlReq); _last_loader = _loader; _loaded_objects[url] = { loaded_object: null, is_loaded: false, queue: new Array() } _loaded_objects[url].loaded_object = _loader; _is_loading = true; } } private function configureListeners(dispatcher:IEventDispatcher):void { dispatcher.addEventListener(Event.COMPLETE, completeHandler); dispatcher.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler); dispatcher.addEventListener(Event.INIT, initHandler); dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); dispatcher.addEventListener(Event.OPEN, openHandler); dispatcher.addEventListener(ProgressEvent.PROGRESS, progressHandler); dispatcher.addEventListener(Event.UNLOAD, unLoadHandler); } private function configureListenersBytes(dispatcher:IEventDispatcher):void { dispatcher.addEventListener(AsyncErrorEvent.ASYNC_ERROR, ioErrorHandler); dispatcher.addEventListener(Event.COMPLETE, completeHandlerBytes); dispatcher.addEventListener(Event.INIT, initHandler); dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); dispatcher.addEventListener(Event.OPEN, openHandler); dispatcher.addEventListener(ProgressEvent.PROGRESS, progressHandler); dispatcher.addEventListener(Event.UNLOAD, unLoadHandler); } public function completeHandlerBytes(event:Event):void { } public function completeHandler(event:Event):void { var hash_object = _loaded_objects[_current_load.url]; _current_load.target.addChild(hash_object.loaded_object); //Перезаписываем hash_object.loaded_object = event.currentTarget.bytes; hash_object.is_loaded = true; //trace(event.currentTarget.bytes); if(hash_object.queue.length){ for(var i:int = 0; i < hash_object.queue.length; i++){ var loader:Loader = new Loader(); this.configureListenersBytes(loader); loader.loadBytes(_last_loader.loaderInfo.bytes); hash_object.queue[i].addChild(loader); } } _is_loading = false; checkQueue(); } private function httpStatusHandler(event:HTTPStatusEvent):void { //trace("httpStatusHandler: " + event); } private function initHandler(event:Event):void { //trace("initHandler: " + event); } private function ioErrorHandler(event:IOErrorEvent):void { trace("ioErrorHandler: " + event); _is_loading = false; if(_current_load.countAttempts > 0){ _current_load.countAttempts--; _loads.push(_current_load); } checkQueue(); } private function openHandler(event:Event):void { //trace("openHandler: " + event); } private function progressHandler(event:ProgressEvent):void { //trace("progressHandler: bytesLoaded=" + event.bytesLoaded + " bytesTotal=" + event.bytesTotal); } private function unLoadHandler(event:Event):void { //trace("unLoadHandler: " + event); } } } Так никто с таким не сталкивался? Последний раз редактировалось Omar2002; 20.07.2011 в 18:28. |
|
|||||
|
Регистрация: Oct 2007
Сообщений: 45
|
Если кому-то пригодится.
Ошибка заключалась в неправильной работе флешплеера. Просто в IE стоял более старый флешплеер. в 10.3 и 11 - этой ошибки нет. |
![]() |
![]() |
Часовой пояс GMT +4, время: 01:32. |
|
|
« Предыдущая тема | Следующая тема » |
|
|