Flex + SOAP webservice延迟了组件更新

时间:2009-06-24 12:19:27

标签: java flex web-services soap

我的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创建了一个虚拟Web服务,它在tomcat上运行。使用wsdl文件的url我在这个项目中为web服务生成了actionscript类。

现在我正在调用一个返回数字的Web服务方法(registerSearchSet(1))。目前它只返回1234。

启动应用程序后,面板的标题显示“Mxml title”,然后大约两分钟后它变为“1234”。

有关延迟原因的任何见解?我有更好的方法吗?

更新: 现在看来,小组的标题正在立即更新,不再有任何延迟。这很奇怪,因为我没有更改代码,我刚刚关闭了flex builder几个小时!

在使用SOAP,Flex和tomcat时,我仍然有兴趣了解最佳实践。

感谢。

1 个答案:

答案 0 :(得分:0)

出于好奇,为什么要手动在enterFrame上调度update-complete事件呢?我没有整个应用程序的运行示例,因此我无法确定它与您正在经历的行为有关,但这对我来说只是闻起来有点不对劲。删除该属性时,Web Service调用会发生什么?

另外,您是否尝试在结果处理程序上设置断点,或者甚至在其中使用跟踪语句,以查看结果实际返回的时间,以确定是否在网络行程发生之前或之后发生延迟?

您需要做的是隔离发生延迟的地方 - 请求之前,请求期间或请求之后 - 然后从那里开始。发生这一切时,你的CPU会发生什么?你跑步的时候注意到尖峰吗? WebService调用工作方式没有真正的魔力,因此必须在您的计算机上,服务器上或您编写的代码或正在项目中其他地方使用的代码中进行某些操作。