Отложенное обновление компонентов веб-сервиса Flex + SOAP - PullRequest
0 голосов
/ 24 июня 2009

Мой проект flex имеет следующий mxml-файл:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
xmlns:coverflow="com.dougmccune.coverflow.*"
layout="vertical" horizontalAlign="center" verticalAlign="middle"
viewSourceURL="srcview/index.html" xmlns:containers="com.dougmccune.containers.*"       xmlns:ns1="com.blitzagency.xray.logger.*" 
   creationComplete="init()">
<mx:Script>
    <![CDATA[
        import mx.events.FlexEvent;
        import generated.webservices.*;

        [Bindable]
        public var numResults: int = 0;

        private function init() : void
        {
            var service:ICarouselService = new CarouselService();
            service.addregisterSearchSetEventListener(registerSearchSetListener);


            // library_id
            service.registerSearchSet(1);

        }


        private function registerSearchSetListener(event:RegisterSearchSetResultEvent):void
        {
            var searchData:SearchMetaData = event.result;
            numResults = searchData.noOfResults;
            if(testpanel != null)
            {
                testpanel.title = "" + numResults;
            }
            //customerItem = new CustomerItem(custData.customerName, custData.customerLogo);
            //g.add(customerItem);
        }
    ]]>
</mx:Script>
<mx:Style>
    Panel {
       borderColor: #99CDEE;
       borderAlpha: 1;
       borderThickness: 1;
       borderThicknessLeft: 1;
       borderThicknessTop: 0;
       borderThicknessBottom: 1;
       borderThicknessRight: 1;
       roundedBottomCorners: false;
       cornerRadius: 5;
       headerColors: #b5e6f3, #81b3e6;
       dropShadowEnabled: false;
       titleStyleName: "mypanelTitle";
       vertical-align:middle;
       horizontal-align:center;
    }

    .mypanelTitle {
       letterSpacing: 1;
       color: #333333;
       fontSize: 12;
       fontWeight: bold;
    }
</mx:Style>


    <mx:VBox id="box" verticalGap="0" height="306" width="100%" maxWidth="600" maxHeight="300" >

        <containers:CoverFlowContainer id="coverflow" width="100%" height="244" 
            horizontalGap="40" borderStyle="inset" backgroundColor="0x000000"
            segments="6" reflectionEnabled="true">


            <mx:Panel width="200" height="200" title="ZOMGZ! Look at the 3D!">
                <mx:DateChooser width="90%" height="90%"/>
            </mx:Panel>

            <mx:Panel id="testpanel" width="200" height="200" title="Mxml title">
                <mx:DataGrid width="100%" height="100%">
                    <mx:columns>
                        <mx:DataGridColumn headerText="Column 1" dataField="col1"/>
                        <mx:DataGridColumn headerText="Column 2" dataField="col2"/>
                        <mx:DataGridColumn headerText="Column 3" dataField="col3"/>
                    </mx:columns>
                </mx:DataGrid>
            </mx:Panel>

            <mx:Panel id="buttonpanel" width="200" height="200" title="Mxml title">
                <mx:Button id="myButton" label="Change title" click="buttonpanel.title = ('hello') "/>
            </mx:Panel>


            <!-- here we're dispatching an UPDATE_COMPLETE event every frame. This is so our PV3D material will
                 update itself properly for this component, since we want the animation to show correctly.
              -->
            <mx:Panel width="200" height="200" title="Showing Animation" 
                enterFrame="event.currentTarget.dispatchEvent(new FlexEvent(FlexEvent.UPDATE_COMPLETE))">
                <mx:ProgressBar width="90%" indeterminate="true" trackHeight="30" labelPlacement="center" />
            </mx:Panel>

        </containers:CoverFlowContainer>
        <mx:Grid width="100%">
            <mx:GridRow width="100%" height="100%">
                <mx:GridItem width="33%" height="100%" horizontalAlign="left">
                    <mx:Text text="1" id="textLeft"/>
                </mx:GridItem>
                <mx:GridItem width="33%" height="100%" horizontalAlign="center">
                    <mx:Text text="{coverflow.selectedIndex + 1}" id="textCenter"/>
                </mx:GridItem>
                <mx:GridItem width="33%" height="100%" horizontalAlign="right">
                    <mx:Text text="{coverflow.numChildren}" id="textRight"/>
                </mx:GridItem>
            </mx:GridRow>
        </mx:Grid>
        <mx:HScrollBar id="scrollbar" width="600" pageSize="1" maxScrollPosition="{coverflow.numChildren - 1}"
            scrollPosition="{coverflow.selectedIndex}" 
            scroll="coverflow.selectedIndex = Math.round(scrollbar.scrollPosition)" />
        <mx:HBox width="100%">
            <mx:Text text="Text" textAlign="left"/>
            <mx:Spacer width="100%"/>
            <mx:Text text="Text" textAlign="center"/>
            <mx:Spacer width="100%"/>
            <mx:Text text="Text" textAlign="right"/>
        </mx:HBox>

    </mx:VBox>  
            </mx:Application>

Итак, я создал фиктивный веб-сервис с использованием Java, и он работает на tomcat. Используя URL-адрес файла wsdl, я сгенерировал классы ActionScript в этом проекте для веб-службы.

Теперь я вызываю один из методов веб-сервиса (registerSearchSet (1)), который возвращает число. На данный момент он просто возвращает 1234.

После запуска приложения заголовок панели говорит «Mxml title», а затем примерно через две минуты он меняется на «1234».

Любое понимание, почему есть задержка? Есть ли лучший способ, которым я должен делать это?

UPDATE: Теперь кажется, что заголовок панели обновляется сразу, больше нет задержки. Это странно, поскольку я не изменил код, я только что закрыл Flex Builder на несколько часов!

Мне все равно было бы интересно узнать о передовых методах использования SOAP, Flex и tomcat.

Спасибо.

1 Ответ

0 голосов
/ 24 июня 2009

Просто из любопытства, почему вы так вручную отправляете событие завершения обновления на enterFrame? У меня нет запущенного образца всего вашего приложения, поэтому я не могу быть уверен, что оно связано с поведением, которое вы испытываете само по себе, но это просто пахнет как-то неправильно для меня. Что происходит с вызовом веб-службы при удалении этого атрибута?

Кроме того, вы пытались установить точку останова на вашем обработчике результатов или даже использовать оператор трассировки, который находится внутри него, чтобы увидеть, когда результат действительно возвращается, чтобы определить, происходит ли задержка до или после отключения по сети?

Что вам нужно сделать, это изолировать, где происходит задержка - до запроса, во время запроса или после запроса - и затем перейти оттуда. Что происходит с вашим процессором, когда все это происходит? Вы замечаете всплеск во время бега? Нет ничего особенного в том, как работают вызовы WebService, поэтому что-то должно происходить либо на вашей машине, на вашем сервере, либо в коде, который вы написали или используете в другом месте вашего проекта.

...