Показать сообщение отдельно
Старый 07.02.2014, 12:43
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 4  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Воркеры это вообще лажа ужасная. Как я понял, адоби на них забили частично, и вряд ли удастся комфортно разрабатывать что-то с воркерами.

Недавно сталкивался с такой же проблемой, и решил ее без воркеров. Распаковка стала чуть дольше, зато приложение не вешает совершенно, и все анимации будут работать. В общем, суть в том, чтобы распаковку делать не в цикле, и покадрово и или по таймеру

В общем, вот такой класс набросал
Код AS3:
package  {
 
 
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.events.TimerEvent;
	import flash.utils.ByteArray;
	import flash.utils.Timer;
	import nochump.util.zip.ZipEntry;
	import nochump.util.zip.ZipFile;
 
	public class ZipUnpacker extends EventDispatcher {
 
		private var _iter:			int					= 0; 
		private var _totalEntries:	int 				= 0;
		private var _zipEntries:	Array/*ZipEntry*/	= null;
		private var _timer:			Timer				= null; 
		private var _zipFile:		ZipFile				= null;
		private var _byteArrays:	Array/*ByteArray*/	= [];
 
		public function ZipUnpacker(zipFile:ZipFile) {
 
			_zipFile		= zipFile;
			_zipEntries		= _zipFile.entries;
			_totalEntries	= _zipEntries.length;
		}
		public function unpack():void {
			_timer 			= new Timer(12, _zipEntries.length +1);
			_timer.addEventListener(TimerEvent.TIMER, onTimer);
			_timer.start();
		}
 
		private function onTimer(e:TimerEvent):void {
			// за один тик распаковываем 10 входов, если надо по одному, то просто убираем цикл
			for (var i:int = 0; i < 10; i++) {
				var percent:	int 		= (_iter / _totalEntries) * 100;
				//trace(percent); // тут можно процент распаковки показывать
 
				var entry:		ZipEntry 	= _zipEntries[_iter];
				var name:		String 		= entry.name;
				var byteArray:	ByteArray 	= _zipFile.getInput(entry);
 
				var indexOfDot:	int 		= name.lastIndexOf(".");
				if (indexOfDot > -1) {																	// значит в названии есть расширение
					var indexOfSlash:	int 	= name.lastIndexOf("/") + 1;
					var fileName:		String 	= name.substr(indexOfSlash, indexOfDot - indexOfSlash);
				} 
				if (byteArray.bytesAvailable > 0) {
					_byteArrays.push(byteArray);
				}
				_iter++;
				if (_iter >= _totalEntries) {
					_timer.reset();
					_timer.removeEventListener(TimerEvent.TIMER, onTimer);
					_timer		= null;
 
					dispatchEvent(new Event(Event.COMPLETE));
					break;
				}
			}
		}
	}
 
}
Передаем в конструктор архив, и ждем события complete.

Распаковывает он все это в байт массивы и помещает в массив. Естественно, в таком виде их вряд ли используешь, поэтому тут уж дальше кому что надо. У меня есть специальный класс обертка, в котором массив превращается в картинку через Loader.loadBytes() так же в этом классе хранится название ввода из архива, чтобы как-то это потом идентифицировать

Работает все так:
Код AS3:
var zipUnpacker:ZipUnpacker = new ZipUnpacker(myLoadedZip);
zipUnpacker.addEventListener(Event.COMPLETE, onZipUnpackComplete);
zipUnpacker.unpack();