BusyIndicator не отображается

Я хочу показать busyIndicator перед запуском HTTPService и скрыть его после завершения rpc:

<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:mx="library://ns.adobe.com/flex/mx"
        xmlns:s="library://ns.adobe.com/flex/spark"
        title="Saisie et envoi"
        creationComplete="creationCompleteHandler(event)" >

    <fx:Declarations>
        <!-- Placer ici les éléments non visuels (services et objets de valeur, par exemple). -->
        <mx:HTTPService id="userRequest" url="{url}/crr.php" resultFormat="text" result="userRequest_resultHandler(event)" useProxy="false" method="POST" />
    </fx:Declarations>

    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;
            import mx.rpc.events.ResultEvent;

            import model.Config;
            import model.Db;

            var conf:Config = new Config();
            public var db:Db = new Db();

            [Bindable]
            public var url:String = conf.getConfigSo("url"); // example :  http://localhost/myfolder

            protected function enregistrer(event:MouseEvent):void
            {
                var param:Object = new Object();
                try {
                    if (db.avoirAttribut("enreg")) {
                        db.setDbSo("enreg", db.getDbSo("enreg")+chp1.text+";"+chp2.text+"\n");
                    }
                    else {
                        db.setDbSo("enreg", chp1.text+";"+chp2.text+"\n");
                    }
                    param.text = "Enregistrement effectué avec succès !";
                    navigator.pushView(Message, param);
                }
                catch (e:Error) {
                    param.text = "Enregistrement non effectué !";
                    navigator.pushView(Message, param);
                }
            }

            protected function lire(event:MouseEvent):void
            {
                area.text = db.getDbSo("enreg");
            }

            protected function send(event:MouseEvent):void
            {
                busy.visible = true;
                userRequest.cancel();
                var params:Object = new Object();
                params.col1 = db.getDbSo("enreg");
                userRequest.send(params);
                busy.visible = false;
            }

            protected function userRequest_resultHandler(event:ResultEvent):void
            {
                resultHTTP.text = userRequest.lastResult.toString();
            }

            protected function creationCompleteHandler(event:FlexEvent):void
            {
                chp1.setFocus();
            }

        ]]>
    </fx:Script>

    <s:Scroller width="100%" height="100%">
        <s:VGroup width="100%" height="100%" paddingTop="5" paddingBottom="5" verticalAlign="middle" horizontalAlign="center" gap="5">
            <s:TextInput id="chp1" width="50%"/>
            <s:TextInput id="chp2" width="50%"/>
            <s:Button label="Enregistrer" click="enregistrer(event)"/>
            <s:Button label="Lire" click="lire(event)"/>
            <s:TextArea id="area" editable="false"/>
             <s:Button label="Envoyer" click="send(event)"/>
            <s:BusyIndicator id="busy" symbolColor="blue" visible="false" />
            <s:Label id="resultHTTP"/>
        </s:VGroup>
    </s:Scroller>

</s:View>

Проблема в том, что во время выполнения BusyIndicator не отображается, хотя я понимаю, что для завершения всей операции потребовалось несколько секунд. Так почему же BusyIndicator не отображается в этом случае?

1 ответ

Решение

Запрос HTTPService send() возвращается при отправке запроса, а не при получении ответа. Таким образом, вы показываете индикатор занятости только в течение короткого периода времени (и на самом деле не совсем, так как рендеринг выполняется в следующем цикле отображения...)

Что вам нужно сделать, это сделать индикатор видимым в функции отправки, как вы это делаете, но скрыть индикатор в обработчике результатов. (Вы должны сделать это и для обработчика ошибок, иначе индикатор все равно будет виден, если в запросе была ошибка)

Другие вопросы по тегам