Flash: загрузка нескольких изображений и ожидание их полной загрузки - PullRequest
1 голос
/ 26 февраля 2010

Мне нужно загрузить несколько изображений из ZIP-архива и выполнить некоторые действия после загрузки всех файлов из ZIP-архива. Я использую библиотеку FZip для работы с файлами ZIP. Моя проблема в том, что иногда загрузка всех файлов не происходит.

В этом коде я запускаю процесс загрузки:

loadedImages = zip.getFileCount();
trace("Starting... "  + loadedImages);
for (var i:uint = 0; i < loadedImages; i++)
{
    var file:FZipFile = zip.getFileAt(i);
    // NamedLoader - common flash.display.Loader who remembers the name of the file
    var pictLdr:Loader = new NamedLoader(file.filename);
    trace("start " + i);
    pictLdr.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoaded);
    pictLdr.loadBytes(file.content, new LoaderContext( false, ApplicationDomain.currentDomain ));
}

private function imageLoaded(e:Event):void
{
    // do some actions, like getting file content and store it
    trace("Loaded: " + loadedImages);
    loadedImages--;
    // if all images has been loaded, I show some scene
    if (loadedImages == 0)
    {
        showScene();
     }    
}

Иногда загружаются не все изображения, и у меня вывод этой трассировки:

Starting... 36
start 0
start 1
start 2
start 3
start 4
start 5
start 6
start 7
start 8
start 9
start 10
start 11
start 12
start 13
start 14
start 15
start 16
start 17
start 18
start 19
start 20
start 21
start 22
start 23
start 24
start 25
start 26
start 27
start 28
start 29
start 30
start 31
start 32
start 33
start 34
start 35
Loaded: 36
Loaded: 35
Loaded: 34
Loaded: 33
Loaded: 32
Loaded: 31
Loaded: 30
Loaded: 29
Loaded: 28
Loaded: 27
Loaded: 26
Loaded: 25
Loaded: 24
Loaded: 23
Loaded: 22
Loaded: 21
Loaded: 20
Loaded: 19
Loaded: 18
Loaded: 17
Loaded: 16
Loaded: 15
Loaded: 14
Loaded: 13

Видно, что все загрузчики запускаются, но не все заканчивают. Никаких исключений не бывает, и это иногда случается. Я не понимаю почему.

1 Ответ

3 голосов
/ 26 февраля 2010

Попробуйте поставить в очередь свои загрузки и выполнять их по одному (т.е. не начинайте загружать image_1, пока image_0 не закончится). Что-то вроде

function createQueue():void
{
    // queue up your loads
    for (var i:uint = 0; i < loadedImages; i++)
    {
        var file:FZipFile = zip.getFileAt(i);
        // NamedLoader - common flash.display.Loader who remembers the name of the file
        var pictLdr:Loader = new NamedLoader(file.filename);
        trace("start " + i);
        pictLdr.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoaded);
        queue.push({loader: pictLdr, file: file});
    }

    loadNext();
}

function loadNext():void
{
    if (queue.length) {
        var obj:Object = queue.shift();
        var file:FZipFile = obj.file;
        var pictLdr:NamedLoader = obj.loader;
        pictLdr.loadBytes(file.content, new LoaderContext( false, ApplicationDomain.currentDomain ));

    }
}

private function imageLoaded(e:Event):void
{
    // do some actions, like getting file content and store it
    trace("Loaded: " + loadedImages);
    loadedImages--;
    // if all images has been loaded, I show some scene else load next image
    loadedImages ? loadNext() : showScene();
}

Я сам видел подобное поведение, и постановка в очередь нагрузок решила проблему. Я думаю, что может происходить в том, что Flash использует только один объект LoaderInfo для всех объектов Loader (не цитируйте меня по этому поводу), и когда вы пытаетесь загрузить серию таких файлов, она может вести себя немного хаотично. Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...