Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Кэширование подгружаемого контента (http://www.flasher.ru/forum/showthread.php?t=160980)

Omar2002 19.07.2011 18:40

Кэширование подгружаемого контента
 
Всем добрый... время суток.

В общем уже часа два листаю форум - перечитал уйму инфы, но конкретной информации по теме найти так и не смог.

Есть флешка, которая подгружает внешние файлы - картинки и swf-ки.
В процессе работы часть этих внешних файлов загружается повторно, а то и по 20-30 раз, причем - каждый раз делается запрос по урлу и браузер возвращает закэшенный файл. Все хорошо, но браузеры работают по-разному, и в некоторых случаях все работает практически не заметно, но иногда - просто страшно тормозит.

Решил может что-то вроеде внутреннего кэша сделать, но не тут-то было.
Т.е. я создаю loader:Loader - гружу в него, например картинку, и добавляю его в свой кэш - массив. после загрузки я делаю TargetObject.addChild(loader);
При повторном обращении по тому же адресу я беру этот же самый loader из кэш-массива и делю addChild но уже другому объекту. Флешь удаляет этот лоадер из списка отображения первого TargetObject, т.е. вся идея рушится, если на экране должны показываться оба объекта одновременно - будет видно только последний.

Т.е. для корректной работы данного метода - необходимо клонировать загруженный объект, т.е. сам loader, но я так понял что это сделать нельзя.

Может кто подскажет в каком направлении двигаться? Или вообще отказаться от этой идей?

etc 19.07.2011 18:57

Loader#loadBytes, LoaderInfo#bytes

nOobCrafter 19.07.2011 19:10

Цитата:

Т.е. для корректной работы данного метода - необходимо клонировать загруженный объект, т.е. сам loader
loader != загруженный объект
если грузите изображение, то есть метод bitmapData#clone()

Omar2002 20.07.2011 10:34

Цитата:

Сообщение от etc (Сообщение 1012978)
Loader#loadBytes, LoaderInfo#bytes

Спасибо - помогло. Правда сначала не мог рвубиться как забрать LoaderInfo, потом дошло, что событие COMPLETE вешается не на Loader, а на сам LoaderInfo и получил его в виде event.currentTarget

Цитата:

loader != загруженный объект
если грузите изображение, то есть метод bitmapData#clone()
Понятно, что Loader - это не сам объект, но он его содержит. А на счет картинок - тут еще надо разбираться что именно грузится. В общем - воспользовался методом etc - работает прекрасно.

Всем спасибо.

Добавлено через 4 часа 28 минут
Так в продолжение темы - при повторной загрузке данных, вернее при загрузве ByteArray с помощью метода loadBytes(); В IE9 выдает эксепшн

Error #2044: Необработанный IOErrorEvent:. text=Error #2124: Неизвестный тип загруженного файла.
И опять же не во всех случаях.
В других браузерах эксепшена не вылетает и все картинки показываются корректно.

В чем может быть дело?

Вот исходник класса:

Код AS3:

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);
                }
        }
}

Добавлено через 47 часов 13 минут
Так никто с таким не сталкивался?

Omar2002 20.02.2012 01:52

Если кому-то пригодится.
Ошибка заключалась в неправильной работе флешплеера. Просто в IE стоял более старый флешплеер. в 10.3 и 11 - этой ошибки нет.


Часовой пояс GMT +4, время: 15:46.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.