Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 19.07.2011, 18:40
Omar2002 вне форума Посмотреть профиль Отправить личное сообщение для Omar2002 Найти все сообщения от Omar2002
  № 1  
Ответить с цитированием
Omar2002

Регистрация: Oct 2007
Сообщений: 45
По умолчанию Кэширование подгружаемого контента

Всем добрый... время суток.

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

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

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

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

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

Старый 19.07.2011, 18:57
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 2  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Loader#loadBytes, LoaderInfo#bytes

Старый 20.07.2011, 10:34
Omar2002 вне форума Посмотреть профиль Отправить личное сообщение для Omar2002 Найти все сообщения от Omar2002
  № 3  
Ответить с цитированием
Omar2002

Регистрация: Oct 2007
Сообщений: 45
Цитата:
Сообщение от etc Посмотреть сообщение
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.07.2011 в 18:28.
Старый 19.07.2011, 19:10
nOobCrafter вне форума Посмотреть профиль Отправить личное сообщение для nOobCrafter Найти все сообщения от nOobCrafter
  № 4  
Ответить с цитированием
nOobCrafter

Регистрация: Nov 2008
Сообщений: 894
Записей в блоге: 1
Цитата:
Т.е. для корректной работы данного метода - необходимо клонировать загруженный объект, т.е. сам loader
loader != загруженный объект
если грузите изображение, то есть метод bitmapData#clone()

Старый 20.02.2012, 01:52
Omar2002 вне форума Посмотреть профиль Отправить личное сообщение для Omar2002 Найти все сообщения от Omar2002
  № 5  
Ответить с цитированием
Omar2002

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 01:32.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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