Показать сообщение отдельно
Старый 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.