Воркеры это вообще лажа ужасная. Как я понял, адоби на них забили частично, и вряд ли удастся комфортно разрабатывать что-то с воркерами.
Недавно сталкивался с такой же проблемой, и решил ее без воркеров. Распаковка стала чуть дольше, зато приложение не вешает совершенно, и все анимации будут работать. В общем, суть в том, чтобы распаковку делать не в цикле, и покадрово и или по таймеру
В общем, вот такой класс набросал
Код 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();