Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   loader.contentLoaderInfo не диспатчит 'complete' на некоторых флэшках (http://www.flasher.ru/forum/showthread.php?t=149502)

Волгоградец 26.01.2011 15:29

loader.contentLoaderInfo не диспатчит 'complete' на некоторых флэшках
 
Привет. Столкнулся с такой проблемой - не загружается определенная swf. Исходника нет. Гружу через Loader. Подписываюсь на contentLoaderInfo. Progress отрабатывает - причем bytesLoaded доходит до bytesTotal и на этом все останавливается. Никаких эрроров нет.
Сначала подумал что это AS2 флэшка - но аниматоры утверждают что это AS3. Попробовал загрузить с помощью URLLoader и посмотреть версию флэшки (в загруженном массиве байтов) - пишет 10-я.
Что это может быть?

P.S.: это не кривизна рук и описок нет - самолично созданная флэшка без проблем грузится.

Aquahawk 26.01.2011 17:16

попробуйте загрузить через URLLoader в bytearray а том из него лоадером через loadbytes.
Если не секретно, то можете на почту вашу подгружаемую swf кинуть(aquahawk[собак]mail.ru). Я в данный момент работаю над проблемой подгрузки всяких чужих флешек и меня этот вопрос очень интересует, таких симптомов как вы описали я ещё не встречал.

in4core 26.01.2011 17:39

Вот что я вам скажу, багов на самом деле много. Встречал такое :
1. При комплит ничего нету ( ответ - стоял твин который иногда не срабатывал )
Пути решения - нет ( если нету чужого исходника ).
2. При комплит не работает навигация ( ответ - проблема stage или не ясная проблема mousechildren ).
Пути решения - все созданные объекты поверх лоадера помещать в mouseChildren = false; даже в том случае кгда на объектах нету слушателей-действий или объект прозрачный

Добавлено через 1 минуту
В вашем случае советаю проверять - loader.content ширину и высоту. Если все ок выводит разеры адекватные, знаит флешка тупо спрятана чем то, или стоят какие нить стопы . всякое бывает

Волгоградец 26.01.2011 18:19

Упс, сорри. Оказывается подгружаемая флэшка грузила в себя библиотеку, а у меня ее не было. В билдере никаких сообщений не было - поэтому я затупил. FD сразу написал проблему.
in4core, причем здесь 'комплит', если я написал что 'комплит' как раз и не срабатывает?

in4core 26.01.2011 19:14

Упс сорри, прочитал не внимательно. Но в любом случае если флешка грузит либу, то либа грузится после added to stage тоесть ваш комплит обязан происходить

Волгоградец 26.01.2011 19:24

Чего? Причем здесь added to stage вообще?

i.o. 26.01.2011 19:30

Цитата:

Причем здесь added to stage вообще?
да так, до кучи :)
А по теме - у меня комплит всегда происходил.

in4core 26.01.2011 21:45

Да еп макарек! Вы издеваетесь? До кучи... и причем тут added to stage? Я вам щас популярно объясню.
Объект A грузит объект B . Если объект В не загружен, то события комплит не произойдет, - ок логично. Если объект В загружен, событие комплит - диспатчится. Ок - с этим у вас я как вижу тоже все в порядке. Ну а теперь рассмотрим объект B . И его класс Main в котором , если я правильно понял, должна быть строчка loadConfigLibraries(); Внимание !!! Секретный обход - если объект B не добавлен на stage, то функция loadConfigLibraries() в Main не выполнилась! О чудо, теперь мы знаем ребятки, что пока комплит не произойдет, запроса на загрузку либ не будет.
П.с. Извиняюсь за сарказм в том случае, если все организовано там подругому, и я заранее не понял сути. А с другой стороны, как же еще могут либы подгружаться если не так...

cleptoman 26.01.2011 21:58

инфокор, у меня убедительная к вам, лично, просьба: ограничить форумчан от вашего бреда.

Psycho Tiger 26.01.2011 22:36

Тааа~~~
Код AS3:

//hot kiss from Russia
var loaderInfo:LoaderInfo=super.root.loaderInfo;
if (loaderInfo.bytesLoaded < loaderInfo.bytesTotal) loaderInfo.dispatchEvent(new Event(Event.COMPLETE));

Жаль метод в LoaderInfo перекрыли.

Волгоградец, а почему RTE не вылетало?

Волгоградец 26.01.2011 23:20

Не знаю, в билдере вообще никакого аутпута, а в FD не эксепшн, а вывод в аутпут - типа такая-то библиотека не найдена.

Psycho Tiger 26.01.2011 23:31

Интересно. Как грузишь библиотеку? Loader?

cleptoman 26.01.2011 23:32

Цитата:

if (loaderInfo.bytesLoaded < loaderInfo.bytesTotal) loaderInfo.dispatchEvent(new Event(Event.COMPLETE));
о_О..

in4core 27.01.2011 04:04

cleptoman у вас видимо каша в голове. Tiger все верно пишет

i.o. 27.01.2011 05:38

Код AS3:

if (loaderInfo.bytesLoaded < loaderInfo.bytesTotal) loaderInfo.dispatchEvent(new Event(Event.COMPLETE));

Может все же == или >= ?

Волгоградец 27.01.2011 12:16

Цитата:

Сообщение от Psycho Tiger (Сообщение 968145)
Интересно. Как грузишь библиотеку? Loader?

Вобщем путаница получилась и много не по теме написано. Объясняю с чем конкретно я столкнулся.
Имеется swf - ВНИМАНИЕ!!! - эта swf дергает из shared библиотеки символы - т.е. лоадеров нет никаких - все происходит explicitly через настройки IDE. Эту swf я гружу. Но если эта swf не находит shared библиотеки из которой она берет символы - то Event.COMPLETE не срабатывает, RTE не выбрасывается, Flash Builder никаких мессаджей не выдает, FD выдает в output
Цитата:

[Fault] invalid_url, information=file:путь к файлу

cleptoman 27.01.2011 13:03

вот потому FD + pure AS3 + SWC

dimarik 27.01.2011 14:52

Старайтесь не использовать shared библиотеки. Там сложная ситуация с их версиями. Когда обновите библиотеку, то по-прежнему будет загружена из кэша браузера старая. На её url сложно повлиять, чтобы добавить в строку запроса необходимые параметры.

Волгоградец 27.01.2011 15:23

Да, с этим есть кое-какие неудобства. Но в нашем случае, думаю, без них (shared библиотек) не обойтись.

КорДум 27.01.2011 15:23

Цитата:

Сообщение от in4core (Сообщение 968194)
cleptoman у вас видимо каша в голове. Tiger все верно пишет

Вообще-то Тигер так пошутил. Его запись вызовет коллапс в главной флешке, ибо сработает сразу же, не дожидаясь загрузки дочерней.

in4core 27.01.2011 16:10

Цитата:

if (loaderInfo.bytesLoaded < loaderInfo.bytesTotal) loaderInfo.dispatchEvent(new Event(Event.COMPLETE));

Может все же == или >= ?
Да проморгал думал там == стоит. Так что нефиг ))

Psycho Tiger 27.01.2011 18:44

Эээ... я же явно написал, что dispatchEvent в loaderInfo перекрыт.
Коллапса не будет, будет тупое RTE.

cleptoman 27.01.2011 19:45

тигра, кроме тебя никто не понял, что ты хотел сказать..инфокор, вон, вообще мне диагноз слабоумия поставил.

FlashWizard 11.03.2011 15:22

Гружу swf в swf-контейнер. Весь подгружаемого swf - 6 МБ. Он просто замирает после окончания загрузки и всё. Что делать? Мне отображает что bytesLoaded равно bytesTotal, но он замирает. Может вес файла влияет на это? Или дело в другом?

Добавлено через 3 минуты
Если обновляю страницу в браузере, срабатывает COMPLETE.

maxkar 11.03.2011 15:47

FlashWizard
Код можно? Ссылка на использованный loader жива или после подписки и начала загрузки она теряется?

Объем ни при чем. И на маленьких объемах некоторые теряют событие. Почему некоторые - у себя такого ни разу пока не встречал, а вот на некоторых сайтах регулярно что-то "не догружается" и приходится по Ctrl-F5 страницу обновлять. А причину найти было бы интересно.

FlashWizard 11.03.2011 16:00

Вот код:
Код AS3:

package {
 
        import flash.display.DisplayObject;
        import flash.display.Stage;
        import flash.display.MovieClip;
        import flash.display.Loader;
        import flash.events.*;
    import flash.net.URLRequest;
        import flash.text.TextField;
 
        public class Main {
 
                private var mainContainer:MovieClip;
 
                //[запросы]
                private var CLBASE_request:URLRequest = new URLRequest();
                private var CLBASE_loader:Loader = new Loader();
                private var CLBASE_url:String = "http://сервер/myswf.swf";
 
                public function MainFrame() {
                        mainContainer = new MovieClip();
                        addChild(mainContainer);
                        load_CLBASE();
                }
 
                public function load_CLBASE() {
                        CLBASE_request.url = CLBASE_url;
                        CLBASE_cnfgL(CLBASE_loader.contentLoaderInfo);
            CLBASE_loader.load(CLBASE_request);
                }
                private function CLBASE_cnfgL(dispatcher:IEventDispatcher):void {
            dispatcher.addEventListener(Event.COMPLETE, completeHandler);
            dispatcher.addEventListener(Event.INIT, initHandler);
        }
 
                private function completeHandler(event:Event):void {
          txt.appendText('Загрузка завершена.' + '\n');
        }
 
        private function initHandler(event:Event):void {
                        baseClient = event.target.content;
                        mainContainer.addChild(baseClient);
        }
 
        }
}


gloomyBrain 11.03.2011 16:28

Цитата:

регулярно что-то "не догружается"
Так бывает, когда сервер не отдает заголовок content-length (или неверно отдает)

FlashWizard 11.03.2011 16:34

и что делать ?

gloomyBrain 11.03.2011 16:52

Научить сервер это делать, чтож еще-то?

PS
Можно ручками сделать loader.loadBytes, когда bytesLoaded == bytesTotal

FlashWizard 11.03.2011 17:24

Цитата:

Научить сервер это делать
Был бы благодарен за подробное объяснение.

Добавлено через 18 минут
Ладно я сделал вторым способом
Прописал это в обработчике прогресса:
Код AS3:

private function progressHandler(event:ProgressEvent):void {
        if (event.bytesLoaded == event.bytesTotal) {
              dispatchEvent(new Event(Event.COMPLETE));
        }
}

Теперь скажите - я всё правильно сделал? Ни каких подводных камней не вылезет ?

dimarik 11.03.2011 18:49

Цитата:

Сообщение от Волгоградец (Сообщение 968020)
Привет. Столкнулся с такой проблемой - не загружается определенная swf. Исходника нет. Гружу через Loader. Подписываюсь на contentLoaderInfo. Progress отрабатывает - причем bytesLoaded доходит до bytesTotal и на этом все останавливается.

Может так дело обстоит?

В конструкторе
Код AS3:

super.loaderInfo.addEventListener(Event.COMPLETE, handler_complete, false, int.MAX_VALUE);

Код AS3:

function handler_complete(event:Event):void {
    event.stopImmediatePropagation();
}


Волгоградец 11.03.2011 19:06

dimarik, это некропост - решение было найдено уже. Тем не менее все равно я не понял что ты хотел донести сейчас...

FlashWizard 12.04.2011 17:19

Опять что-то не так.
Цитата:

Можно ручками сделать loader.loadBytes, когда bytesLoaded == bytesTotal
Я сделал так - работало. А сейчас резко перестало, опять заклинивается и не диспатчит событие.

Цитата:

Так бывает, когда сервер не отдает заголовок content-length (или неверно отдает)
Не подскажите как сделать, чтобы сервер правильно отдавал заголовок content-length ?

wvxvw 12.04.2011 18:11

Такое бывает при включеном gzip например. Особенно ИЕ не дружит с этим и не правильно / самостоятельно определяет размер контента. Скорее всего проблему кустарными способами не решить, только если она не возникла врезультате таких же кустарных манипуляций. Еще nginx известен тем, что перевирает размер контента, как с этим разбираться - не знаю.

ЗЫ. Если bytesLoaded != bytesTotal - то это уже очень плохо :) тут уже на клиенте это никак не решить. Надо чтобы присылали все, что запрашивалось.

FlashWizard 12.04.2011 19:14

Цитата:

Если bytesLoaded != bytesTotal - то это уже очень плохо
Не, всё правильно. Они равны. Кажется просто не диспатчится событие:
Код AS3:

private function progressHandler(event:ProgressEvent):void {
        if (event.bytesLoaded == event.bytesTotal) {
                  dispatchEvent(new Event(Event.COMPLETE));
        }
}

Почему? Может не правильно диспатчу?

Добавлено через 46 часов 42 минуты
Кстати, обращаюсь к dimarik-у:
Цитата:

Может так дело обстоит?

В конструкторе
Код AS3:

super.loaderInfo.addEventListener(Event.COMPLETE, handler_complete, false, int.MAX_VALUE);

Код AS3:

function handler_complete(event:Event):void {
    event.stopImmediatePropagation();
}


объясните что вы сделали?

justin_g 21.04.2011 16:53

У меня была подобная проблема. Одновременно грузились несколько swf. ProgressEvent.PROGRESS показывал 100%, а вот Event.COMPLETE у некоторых пропадал.
Решилось всё переносом момента создания ссылки на объект: сначала я создавал ссылку по событию COMPLETE; стал создавать сразу после создания самого Loader'а - всё нормализовалось.
Я думаю, в моём случае, причина была в том, что загрузившийся и оставшийся без ссылки лоадер съедал GC.


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

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