Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Управление ходом иницализации Application (http://www.flasher.ru/forum/showthread.php?t=147764)

Felicast 13.12.2010 17:38

Управление ходом иницализации Application
 
добрый день
в общем, проблема такая:
есть flex-приложение, ресурсы хранятся отдельно. в зависимости от локали с помощью resourceManager.loadResourceModule грузится тот или иной ресурс. дак вот проблема в том, что Application успевает проинициализироваться до того как догрузятся ресурсы, следовательно все надписи и рисунки не отображаются пока не догрузится файл ресурсов.
дак вот, можно ли как-то управлять ходом инициализации приложения, чтобы прелоадер отображался вплоть до завершения загрузки ресурсов? если нельзя, то может есть какие-то другие предложения?

Lexxx_HU 13.12.2010 19:56

я сделал следующим образом, у меня при инициализации запускается и загружается множество всего, и функции, и картинки и xml
Код AS3:

public var array_functions:ArrayCollection = new ArrayCollection();
array_functions.addItem({call_function:setUserMy, call_info:'Загрузка личной информации'});

и так далее..

Код AS3:

_progBar.setProgress(call_i+1, array_functions.length);
        _progBar.label = array_functions[call_i].call_info;
        call_i++;
        var timerFunctions:Timer = new Timer(1000, array_functions.length);
        timerFunctions.addEventListener(TimerEvent.TIMER, call_func);
 
 
        timerFunctions.start();

через каждую секунду запускается функция и прогресс бар меняет значение и надпись в нем


а если вам нужно имеено ожидание от загрузки фото например то вот таким способом можно
Код AS3:

// функция загрузки фото      
public function loadPhoto(Img:Image, path:String):void {
        var context:LoaderContext = new LoaderContext();
        context.checkPolicyFile = true; // Заставляем проверить политику
        var avaloader:Loader = new Loader();// новый загрузчик авы
        var avarequest:URLRequest = new URLRequest(); //новый Url запрос для получения аватарки
        avarequest.url = path; //присваеваем URL адресу ссылку на аватар пользователя
        avaloader.contentLoaderInfo.addEventListener(Event.COMPLETE,
                function ():void {
                        Img.source = avaloader;
                }
        ); //добавляем слушителя когда загрузиться аватарка
        avaloader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,
                function ():void {
                        //loadPhoto(Img, path);
                        Img.source = noavatarClass;
                }
        );
        avaloader.load(avarequest, context); //начинаем грузить аватарку
}


alatar 13.12.2010 19:57

Сделать два состояния. В первом показать прелоадер для ресурсов. Во втором само приложение. После загрузки модуля переключиться на второе состояние.

Felicast 14.12.2010 12:10

Цитата:

Сообщение от alatar (Сообщение 956978)
Сделать два состояния. В первом показать прелоадер для ресурсов. Во втором само приложение. После загрузки модуля переключиться на второе состояние.

ну эта идея первая посетила мою голову, но придется делать отдельный прелоадер. к тому же у Application есть фаза инициализации, дак почему бы не запихать туда.
в общем, пара часов ковыряния исходников flex привели к следующим результатам: инициализация компонента происходит в методе initialize (в классе UIComponent). по-сути, можно попробовать его переопределить, но создавая приложение в mxml разметке, этот метод уже переопределяется, так-что нам его уже не переопределить (точнее можно, но нужно наследоваться в обычном as файле).
также замечаем, что есть свойство initialized, которое становится true, когда компонент уже проинициализирован. так может нам вручную проставить его в false. но так тоже делать нельзя, так как управлением этого свойства занимается LayoutManage. идем в его исходники и замечаем, что устаановка этого свойства происходит на основании значения свойства processedDescriptors. причем попутно замечаем, что это свойство как раз меняется после выполнения инициализации посредством вызова метода initializationComplete. вот оно! его то мы и переопределим. в итоге получаем следующее:
Код AS3:

...
public var resourcesInitialized:Boolean;
private function preinitializeHandler():void
{
        resourcesInitialized = false;
        //грузим ресурс
        var eventDispatcher:IEventDispatcher = resourceManager.loadResourceModule("resources.swf");
          eventDispatcher.addEventListener(ResourceEvent.COMPLETE, completeHandler);
}
override protected function initializationComplete():void
{
        if (!resourcesInitialized)
        {
                processedDescriptors = false;
        }
        else
        {
                processedDescriptors = true;
        }
}
private function completeHandler(event:ResourceEvent) : void
{
        resourceManager.localeChain = ["ru_RU"];
        resourcesInitialized = true;
        initializationComplete();
}

ну вот работает, пока ресурсы не догрузятся, отображается прогресс бар (правда он не отображает непосредственно процесс загрузка, а просто замирает). после инициализации приложение запускается уже со всеми ресурсами.

UPD: кстати данное управление инициализацией возможно и в других компонентах (что кстати и сделано в некоторых стандартных)

alatar 14.12.2010 13:25

В принципе есть еще варианты:
1. Загрузить модуль в прелоадере, что бы он попал в кэш. Это ускорит повторную загрузку.
2. Загрузить модуль в прелоадере, и скормить в resourceManager уже загруженный.

Felicast 14.12.2010 15:06

Цитата:

Загрузить модуль в прелоадере, что бы он попал в кэш. Это ускорит повторную загрузку.
я тестирую локально (без загрузки по сети), все-равно видно мелькание при загрузке ресурсов, так что не вариант
Цитата:

Загрузить модуль в прелоадере, и скормить в resourceManager уже загруженный.
вот это уже хорошая идея. для этого мне нужно будет подсовывать свой прелоадер?

alatar 14.12.2010 15:18

Да. впрочем его в любом случае пришлось бы делать свой.


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

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